2016-05-22 5 views
3

In dieser Beispieltabelle mit zwei Zeilen und vier Spalten, und die ersten beiden Zellen jeder Zeile enthalten PDF-Dateien, was ist Ich möchte extrahieren. Die anderen beiden in jeder Zeile sind ZIP-Dateien.Zugriff auf 'td' Tags nach der ersten Zeile der Tabelle nach dem Extrahieren/Zerlegen einiger 'td' Tags

Ich weiß, ich kann direkt für PDF-Dateien in der 'findAll' Methode filtern, aber diese Tabelle ist nur ein kleiner Teil. Und die gesamte HTML-Seite ist fürchterlich widersprüchlich (zumindest für mich).

Also dachte ich über das Entfernen der Tags, die die PDF-Dateien nicht enthalten. Ich habe die Ergebnisse nicht verstanden.

Wenn ich 'zerlegen' verwende, um die Tags zu entfernen, die ZIP-Dateien enthalten, sind nur die PDF-Dateien in der ersten Zeile zugänglich; die zwei in der zweiten Reihe werden nicht gedruckt. Wenn ich jedoch die gesamte Suppe drucke, sind die PDF-Dateien in der zweiten Reihe immer noch da. Ich kann nur nicht mit findAll zugreifen. Drucken 'supp.contents' gibt mir auch nur die erste Zeile.

Wenn ich 'extrahieren' statt 'zerlegen' benutze, ist wieder nur die erste Zeile zugänglich. Bei dieser Methode wird jedoch auch die erste ZIP-Datei in der ersten Zeile gedruckt (die ich extrahiert habe und nicht gedruckt werden soll).

Hier ist mein Code:

from bs4 import BeautifulSoup 
import re 

html = ''' 
<tr> 
<td><a href="http://example.com/r1c1.PDF">Chapter 3</a></td> 
<td><a href="http://example.com/r1c2.pdf">Chapter 3</a></td> 
<td><a href="http://example.com/r1c3.zip">Protect...stems</a></td> 
<td><a href="http://example.com/r1c4.zip">Protect...stems</a></td> 
</tr> 
<tr> 
<td><a href="http://example.com/r2c1.PDF">Chapter 4</a></td> 
<td><a href="http://example.com/r2c2.pdf">Chapter 4</a></td> 
<td><a href="http://example.com/r2c3.zip">Busine...Part 1 </a></td> 
<td><a href="http://example.com/r2c4.zip">Busine...Part 1 </a></td> 
</tr> 
''' 

soup = BeautifulSoup(html, 'lxml') 

for i in soup.findAll('td'): 
    print(i.a['href'])     # This prints all the links correctly 

print() 

for i in soup.findAll('td'): 
    if re.match('.*zip', i.a['href']): 
     i.extract() 

for i in soup.findAll('td'): 
    print(i.a['href'])     # This prints only the first two PDF files 

Und hier ist der Ausgang (mit 'decompose'):

# Here are all the links 
http://example.com/r1c1.PDF 
http://example.com/r1c2.pdf 
http://example.com/r1c3.zip 
http://example.com/r1c4.zip 
http://example.com/r2c1.PDF 
http://example.com/r2c2.pdf 
http://example.com/r2c3.zip 
http://example.com/r2c4.zip 

# Only the first row gets printed 
http://example.com/r1c1.PDF 
http://example.com/r1c2.pdf 

Und hier ist der letzte Teil der Ausgabe, wenn ich 'Auszug' verwenden:

. 
. 
. 

# The first row does get printed, but so does the first ZIP file in it 
http://example.com/r1c1.PDF 
http://example.com/r1c2.pdf 
http://example.com/r1c3.zip 

Fehle ich etwas oder mache ich etwas falsch?

Programme Ich verwende:

  • Python - 3.4.0
  • BS4 - 4.4.0

EDIT:

Hier sind die Screenshots auf meiner Ausgabe :

Output of the script

Die erste Ausgabe ist das Ergebnis der Verwendung der Methode "decompose" und die zweite von "extract".

Ich weiß nicht, ob es wichtig ist, aber ich habe es nicht wirklich aus dem Internet abgeschabt. Ich lud zuerst die Seiten herunter und kratzte dann von den lokalen Kopien.

EDIT 2:

ich alle PDF-Dateien in zwei separate Dateien (Lernmaterialien und Praxishandbuch - die ersten beiden Spalten) kombinieren möchten. Ich plane, diesen Schritt in das Skript selbst aufzunehmen.

Zur Herstellung des automatisierten Umbenennen einfacher Ich mag die Dateien mit einem gewissen Muster umbenennen wie:

[study/practice][module] [text of the 'td' tag].pdf 

Zum Beispiel ‚0‘ einen Teil des Studienmaterials bezeichnen würde, und ‚1‘, dass die Praxis So Handbuch

, für 'Kapitel 1 Entwicklung im Business Environment' (im Modul 1):

'01 Kapitel 1 ... .pdf‘wäre Teil Study Material

'11 Kapitel 1 ... .pdf 'wäre Teil des Praxishandbuchs.

Und Kapitel 4 (das erste in Modul 2) des Studienmaterials wäre "02 Ch 4 ... .pdf".

Die Seiten auf dieser Website sind inkonsistent und ich dachte, dass mein Job einfacher wäre, wenn ich nur alle "td" -Tags eliminieren würde, die entweder die Links zu den ZIP-Dateien oder einfach nicht brechbaren Platz (; nbsp) enthielten. Das ist, als ich auf dieses Problem stieß, nicht auf alle 'td' Elemente zugreifen zu können.

+0

Können Sie den Link teilen? Auch mit Ihrem letzten Code-Snippet bekomme ich jede URL –

+0

Hier ist der Link: http://www.icai.org/post.html?post_id=10160 – Mahesh

Antwort

1

Sie können alle PDF-Dateien und Reißverschlüsse aus der zweiten Tabelle nach dem id = cPost div, die erhalten:

import requests 
from bs4 import BeautifulSoup 

r = requests.get("http://www.icai.org/post.html?post_id=10160").text 
soup = BeautifulSoup(r, "lxml") 

# get second table after cpost 
table = soup.select_one("#cpost").select_one("table:nth-of-type(2)") 

# find all anchor tags where the href value endswith .pdf and .zip 
pdfs = [a["href"] for a in table.select("td a[href$=.pdf]")] 
zips = [a["href"] for a in table.select("td a[href$=.zip]")] 
print(pdfs) 
print(zips) 

Welche gibt Ihnen:

['http://220.227.161.86/28999sm_finalnew_cp-initialpages.pdf', 'http://220.227.161.86/31899sm_finalnew_vol2A_iniipages.pdf', 'http://220.227.161.86/18905sm_finalnew_cp1a.pdf', 'http://220.227.161.86/21520sm_finalnew_vol2_cp1.pdf', 'http://220.227.161.86/18854sm_finalnew_cp2.pdf', 'http://220.227.161.86/21521sm_finalnew_vol2_cp2.pdf', 'http://220.227.161.86/18855sm_finalnew_cp3.pdf', 'http://220.227.161.86/21522sm_finalnew_vol2_cp3.pdf', 'http://220.227.161.86/36605sm_finalnew_feedbackform-m1.pdf', 'http://220.227.161.86/36606sm_finalnew_cp-initialpages-m2.pdf', 'http://220.227.161.86/18856sm_finalnew_cp4.pdf', 'http://220.227.161.86/21523sm_finalnew_vol2_cp4.pdf', 'http://220.227.161.86/18857sm_finalnew_cp5.pdf', 'http://220.227.161.86/21524sm_finalnew_vol2_cp5.pdf', 'http://220.227.161.86/18858sm_finalnew_cp6.pdf', 'http://220.227.161.86/21525sm_finalnew_vol2_cp6.pdf', 'http://220.227.161.86/18859sm_finalnew_cp7.pdf', 'http://220.227.161.86/21526sm_finalnew_vol2_cp7.pdf', 'http://220.227.161.86/18860sm_finalnew_cp8.pdf', 'http://220.227.161.86/21527sm_finalnew_vol2_cp8.pdf', 'http://220.227.161.86/18861sm_finalnew_cp9.pdf', 'http://220.227.161.86/21528sm_finalnew_vol2_cp9.pdf', 'http://220.227.161.86/31901sm_finalnew_cp-feedbackformvolA.pdf', 'http://220.227.161.86/36607sm_finalnew_cp-initialpages-m3.pdf', 'http://220.227.161.86/31900sm_finalnew_vol2B_iniipages.pdf', 'http://220.227.161.86/18862sm_finalnew_cp10.pdf', 'http://220.227.161.86/21529sm_finalnew_vol2_cp10.pdf', 'http://220.227.161.86/18970sm_finalnew_cp11.pdf', 'http://220.227.161.86/21530sm_finalnew_vol2_cp11.pdf', 'http://220.227.161.86/18971sm_finalnew_cp12.pdf', 'http://220.227.161.86/21531sm_finalnew_vol2_cp12.pdf', 'http://220.227.161.86/18863sm_finalnew_cp13.pdf', 'http://220.227.161.86/21532sm_finalnew_vol2_cp13.pdf', 'http://220.227.161.86/18972sm_finalnew_cp14.pdf', 'http://220.227.161.86/21533sm_finalnew_vol2_cp14.pdf', 'http://220.227.161.86/18864sm_finalnew_cp15.pdf', 'http://220.227.161.86/21534sm_finalnew_vol2_cp15.pdf', 'http://220.227.161.86/18865sm_finalnew_cp16.pdf', 'http://220.227.161.86/21535sm_finalnew_vol2_cp16.pdf', 'http://220.227.161.86/29001sm_finalnew_cp-appendix.pdf', 'http://220.227.161.86/31903sm_finalnew_cp-appendix-pmvolab.pdf', 'http://220.227.161.86/29000sm_finalnew_cp-feedbackform.pdf', 'http://220.227.161.86/31902sm_finalnew_cp-feedbackformvolB.pdf'] 
['http://www.mediafire.com/file/7g7zhhlzmd2u49u/P5Ch1DevelopmentsBusinessEnvironmenP1.zip', 'http://www.mediafire.com/file/tx0dhvlkx9w518s/P5Ch1DevelopmentSBusinessEnvironmentP1.zip', 'http://www.mediafire.com/file/751095mme1hd5z7/P5Ch1DevelopmentsBusinessEnvironmentP2.zip', 'http://www.mediafire.com/file/ifn2nn57czr5djm/P5Ch1DevelopmentsBusinessEnvironmentP2.zip', 'http://www.mediafire.com/file/trf1adc5a1gr4at/P5Ch1DevelopmentsBusinessEnvironmentP3.zip', 'http://www.mediafire.com/file/ofjv0pu00v35ivc/P5Ch1DevelopmentsBusinessEnvironmentP4.zip', 'http://www.mediafire.com/file/us454ahc99llili/P5Ch1DevelopmentsBusinessEnvironmentP4.zip', 'http://www.mediafire.com/file/etps8fn6y26qyyn/P5Ch1DevelopmentsBusinessEnvironmentP5.zip', 'http://www.mediafire.com/file/659coi5bhg8ku50/P5Ch1DevelopmentsBusinessEnvironmentP5.zip', 'http://www.mediafire.com/file/2fhzegia69op9ao/FP5Ch2DecisionMakingAndCVPAnalysisPart1.zip', 'http://www.mediafire.com/file/rrbciytpktmh121/FP5Ch2DecisionMakingAndCVPAnalysisPart1.zip', 'http://www.mediafire.com/file/ivtvwvknl5w7bc7/FP5Ch2DecisionMakingAndCVPAnalysisPart2.zip', 'http://www.mediafire.com/file/ba87eg665dtwaui/FP5Ch2DecisionMakingAndCVPAnalysisPart2.zip', 'http://www.mediafire.com/file/lyzb1yic8l7alst/FP5Ch2DecisionMakingAndCVPAnalysisPart3.zip', 'http://www.mediafire.com/file/8iln8yigbzrla3k/FP5Ch2DecisionMakingAndCVPAnalysisPart3.zip', 'http://www.mediafire.com/file/7aafaoqgsq5dg6u/P5Ch3PricingDecisions.zip', 'http://www.mediafire.com/file/fbmdhlqm8ey3aue/P5Ch3PricingDecisions.zip', 'http://www.mediafire.com/file/0ixhgb0x07qu1an/P5Ch4BudgetP1.zip', 'http://www.mediafire.com/file/wqlk53ol26j4lmm/P5Ch4BudgetP1.zip', 'http://www.mediafire.com/file/b9dsw8sudsud7eg/P5Ch4BudgetP2.zip', 'http://www.mediafire.com/file/mrbw44z2mru2tnw/P5Ch4BudgetP2.zip', 'http://www.mediafire.com/file/hfndpfthdfm7l7s/P5Ch4Budget_3.zip', 'http://www.mediafire.com/file/03yzz48no2ttbta/P5Ch4BudgetP3.zip', 'http://www.mediafire.com/file/usxz01xiuw6rgaj/P5Ch4Budget4.zip', 'http://www.mediafire.com/file/qoyjgu61luvsd71/P5Ch4BudgetP4.zip', 'http://www.mediafire.com/file/m3h6qm2gevdmx4n/P5Ch5StandardCosting.zip', 'http://www.mediafire.com/file/wdj8nsl7to2u6cz/P5Ch5StandardCostingPodcast.zip', 'http://www.mediafire.com/file/x9ypv4oxx573ea4/P5Ch5StandardCostingPart1.zip', 'http://www.mediafire.com/file/ax1taa1ahaga2w3/P5Ch5StandardCostingPart1.zip', 'http://www.mediafire.com/file/z0z0pxp5l44qnz4/P5Ch5StandardCostingPart2.zip', 'http://www.mediafire.com/file/h8stxmsqcdqum9q/P5Ch5StandardCostingPart2.zip', 'http://www.mediafire.com/file/v33bcec4ep6ulxc/P5Ch6CostingofServiceSector.zip', 'http://www.mediafire.com/file/i9y7gebccovv852/P5Ch6CostingofServiceSector.zip', 'http://www.mediafire.com/file/bd61s151fgk1xbs/P5Ch7TransferPricing.zip', 'http://www.mediafire.com/file/iwf47hp8bb6wtdq/P5Ch7TransferPricing.zip', 'http://www.mediafire.com/file/ihn7dz4okrvl8c6/P5Ch8UniformCostingAndIFC.zip', 'http://www.mediafire.com/file/44nqn834616kqvb/P5Ch8UniformCostingAndIFC.zip', 'http://www.mediafire.com/file/hfyr8y6w18klua8/P5Ch9CostsheetPAAndReporting.zip', 'http://www.mediafire.com/file/dnxlsmifismp269/P5Ch9CostSheetPAAndReporting.zip', 'http://www.mediafire.com/file/ef27t3y4ly7zsqa/P5Ch11LINEARPROGRAMMINGPart2.zip', 'http://www.mediafire.com/file/66zwcr87sxu8r08/P5Ch11LINEARPROGRAMMINGV5R.zip', 'http://www.mediafire.com/file/03340dc0g94t3r9/P5Ch11LINEARPROGRAMMINGV5R.zip', 'http://www.mediafire.com/file/i3dcrrbcfcy7xqh/P5Ch11LINEARPROGRAMMINGPart2.zip', 'http://www.mediafire.com/file/j870no55rq8qu55/P5Ch11Transportation_rev.zip', 'http://www.mediafire.com/file/vm75wz1j93s284c/P5Ch11Transportation.zip', 'http://www.mediafire.com/file/0qibqc72f2zdf6g/P5Ch12AssignmentProblem.zip', 'http://www.mediafire.com/file/7iqrbl2ze6wh7mp/P5Ch12AssignmentProblem.zip', 'http://www.mediafire.com/file/nds6vcp6b7ws36h/P5Ch13CriticalpathAnalysis.zip', 'http://www.mediafire.com/file/wurwuaspw9ne954/P5Ch13CriticalpathAnalysis.zip', 'http://www.mediafire.com/file/stxrr65qth1jmi3/P5Ch14PERT.zip', 'http://www.mediafire.com/file/mzlg290e1gy3ce5/P5Ch14PERT.zip', 'http://www.mediafire.com/file/jhad7r6qxexkvug/P5Ch15Simulation.zip', 'http://www.mediafire.com/file/af2r0p99m36uvd4/P5C15SimulationV2.zip', 'http://www.mediafire.com/file/vl59gzd8szy83rw/P5Ch16LearningCurveTheory.zip', 'http://www.mediafire.com/file/439dd5eec4c6u2i/P5Ch16LearningCurveTheory.zip'] 

Welche genau übereinstimmt, was Sie sehen, auf der Seite.

Wenn Sie nur dann von 1 Spalte wollen und und mit der td Text umzubenennen:

# get second table after cpost 
table = soup.select_one("#cpost").select_one("table:nth-of-type(2)") 
rows = table.select("tr") 

for row in rows: 
    td1 = row.select_one("td:nth-of-type(1)") 
    td2 = row.select_one("td:nth-of-type(2)") 
    l1, l2 = td1.select_one("a[href$=.zip]"), td2.select_one("a[href$=.pdf]") 
    if l1: 
     print("Found zip {}".format(l1["href"])) 
     print(td1.text) 
    if l2: 
     print("Found pdf {}".format(l2["href"])) 
     print(td2.text) 
    print() 

Welche gibt Ihnen:

Found pdf http://220.227.161.86/31899sm_finalnew_vol2A_iniipages.pdf 
Initial Pages 

Found pdf http://220.227.161.86/21520sm_finalnew_vol2_cp1.pdf 
Chapter 1 Developments in the Business Environment 

Found zip http://www.mediafire.com/file/751095mme1hd5z7/P5Ch1DevelopmentsBusinessEnvironmentP2.zip 
Developments in the Business Environment Part 2 


Found zip http://www.mediafire.com/file/ofjv0pu00v35ivc/P5Ch1DevelopmentsBusinessEnvironmentP4.zip 
Developments in the Business Environment Part 4 

Found zip http://www.mediafire.com/file/etps8fn6y26qyyn/P5Ch1DevelopmentsBusinessEnvironmentP5.zip 
Developments in the Business Environment Part 5 

Found pdf http://220.227.161.86/21521sm_finalnew_vol2_cp2.pdf 
Chapter 2 Decision Making using Cost Concepts and CVP Analysis 

Found zip http://www.mediafire.com/file/ivtvwvknl5w7bc7/FP5Ch2DecisionMakingAndCVPAnalysisPart2.zip 
Decision Making using Cost Concepts and CVP Analysis part2 

Found zip http://www.mediafire.com/file/lyzb1yic8l7alst/FP5Ch2DecisionMakingAndCVPAnalysisPart3.zip 
Decision Making using Cost Concepts and CVP Analysis part3 

Found pdf http://220.227.161.86/21522sm_finalnew_vol2_cp3.pdf 
Chapter 3 Pricing Decisions 




Found pdf http://220.227.161.86/21523sm_finalnew_vol2_cp4.pdf 
Chapter 4 Budget & Budgetary Control 

Found zip http://www.mediafire.com/file/b9dsw8sudsud7eg/P5Ch4BudgetP2.zip 
Budget and Budgetary Control Part 2 

Found zip http://www.mediafire.com/file/hfndpfthdfm7l7s/P5Ch4Budget_3.zip 
Budget and Budgetary Control Part 3 

Found zip http://www.mediafire.com/file/usxz01xiuw6rgaj/P5Ch4Budget4.zip 
Budget and Budgetary Control Part 4 

Found pdf http://220.227.161.86/21524sm_finalnew_vol2_cp5.pdf 
Chapter 5 Standard Costing 

Found zip http://www.mediafire.com/file/x9ypv4oxx573ea4/P5Ch5StandardCostingPart1.zip 
Standard Costing - Part 1 

Found zip http://www.mediafire.com/file/z0z0pxp5l44qnz4/P5Ch5StandardCostingPart2.zip 
Standard Costing - Part 2 

Found pdf http://220.227.161.86/21525sm_finalnew_vol2_cp6.pdf 
Chapter 6 Costing of Service Sector 

Found pdf http://220.227.161.86/21526sm_finalnew_vol2_cp7.pdf 
Chapter 7 Transfer Pricing 

Found pdf http://220.227.161.86/21527sm_finalnew_vol2_cp8.pdf 
Chapter 8 Uniform Costing & Inter-firm Comparison 

Found pdf http://220.227.161.86/21528sm_finalnew_vol2_cp9.pdf 
Chapter 9 Cost Sheet, Profitability Analysis and Reporting 

Found pdf http://220.227.161.86/31901sm_finalnew_cp-feedbackformvolA.pdf 
Feedback Form 



Found pdf http://220.227.161.86/31900sm_finalnew_vol2B_iniipages.pdf 
Initial Pages 

Found pdf http://220.227.161.86/21529sm_finalnew_vol2_cp10.pdf 
Chapter 10 Linear Programming 

Found zip http://www.mediafire.com/file/03340dc0g94t3r9/P5Ch11LINEARPROGRAMMINGV5R.zip 
Linear Programming – Part 2 

Found pdf http://220.227.161.86/21530sm_finalnew_vol2_cp11.pdf 
Chapter 11 The Transportation Problem 

Found pdf http://220.227.161.86/21531sm_finalnew_vol2_cp12.pdf 
Chapter 12 The Assignment Problem 

Found pdf http://220.227.161.86/21532sm_finalnew_vol2_cp13.pdf 
Chapter 13 Critical Path Analysis 

Found pdf http://220.227.161.86/21533sm_finalnew_vol2_cp14.pdf 
Chapter 14 Program Evaluation and Review Technique 

Found pdf http://220.227.161.86/21534sm_finalnew_vol2_cp15.pdf 
Chapter 15 Simulation 

Found pdf http://220.227.161.86/21535sm_finalnew_vol2_cp16.pdf 
Chapter 16 Learning Curve Theory 

Found pdf http://220.227.161.86/31903sm_finalnew_cp-appendix-pmvolab.pdf 
Appendix 

Found pdf http://220.227.161.86/31902sm_finalnew_cp-feedbackformvolB.pdf 
Feedback Form 
+0

Entschuldigung, ich hätte das früher sagen sollen. Ihre Antwort ist großartig, wenn ich nur die PDF-Dateien extrahieren wollte. Bitte beachten Sie meine EDIT 2 um zu wissen, warum ich die 'td' Tags mit den ZIP-Dateien entfernen wollte. – Mahesh

+0

Übrigens, ist es nur ich oder sind Sie auch nicht in der Lage, auf die 'td' Tags jenseits der ersten Zeile zuzugreifen? Zu Testzwecken wählte ich drei oder vier Zeilen (so dass es PDF-Dateien sowie einige ZIP-Dateien und nicht brechbare Leerzeichen gab), was mir die Ergebnisse lieferte, die ich in der Frage gepostet habe. – Mahesh

+0

@Mahesh, '... 16LearningCurveTheory.zip' ist die letzte Datei in der Tabelle. Wenn ich also nur auf die erste zugreifen könnte, würde ich das nicht sehen. Ich sehe immer noch nicht, warum Sie etwas entfernen wollen, wie Sie können, was Sie wollen, von der Quelle einschließlich der TD-Text –

Verwandte Themen