summaryrefslogtreecommitdiff
path: root/doc.jp/index.html
blob: 158f6d9aca2b8a45aa7267af32d7ccb311d7bdf4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    <title>kondou.com - Beautiful Soup 4.2.0 Doc. 日本語訳 (2013-11-19最終更新)</title>

    <link rel="stylesheet" href="_static/default.css" type="text/css" />
    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />

    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    './',
        VERSION:     '4.2.0',
        COLLAPSE_INDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  true
      };
    </script>
    <script type="text/javascript" src="_static/jquery.js"></script>
    <script type="text/javascript" src="_static/underscore.js"></script>
    <script type="text/javascript" src="_static/doctools.js"></script>
    <link rel="top" title="Beautiful Soup 4.2.0 Doc. 日本語訳 (2013-11-19最終更新)" href="#" />
  </head>
  <body>
    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="genindex.html" title="General Index"
             accesskey="I">index</a></li>
        <li><a href="#">Beautiful Soup 4.2.0 Doc. 日本語訳 (2013-11-19最終更新)</a> &raquo;</li>
      </ul>
    </div>

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body">

  <div class="section" id="beautiful-soup">
<h1>Beautiful Soup<a class="headerlink" href="#beautiful-soup" title="Permalink to this headline">¶</a></h1>
<img alt="&quot;The Fish-Footman began by producing from under his arm a great letter, nearly as large as himself.&quot;" class="align-right" src="6.1.jpg" />
<p><a class="reference external" href="http://www.crummy.com/software/BeautifulSoup/">Beautiful Soup</a> はHTMLやXMLファイルからデータを取得するPythonのライブラリです。あなたの好きなパーサー(構文解析器)を使って、パースツリー(構文木)の探索、検索、修正を行います。
これはプログラマーの作業時間を大幅に短縮してくれます。</p>
<div class="section" id="id2">
<h2>(訳注)石鹸は食べられない<a class="headerlink" href="#id2" title="Permalink to this headline">¶</a></h2>
<p>この文書は <a class="reference external" href="http://www.crummy.com/software/BeautifulSoup/bs4/doc/">Beautiful Soup 4.2.0 Documentation</a> の日本語訳です。&#8221;Beautiful Soup&#8221;を&#8221;ビューティフルソープ&#8221;と読んでしまう英語が苦手でちょっぴりHな後輩のために翻訳しました。</p>
<p>2013年10月29日からこの文書の翻訳をはじめました。11月1日現在まだ全てを訳し終えていませんが、スクレイピングに使う主な部分はとりあえず訳したので、一旦これで公開して、あとは年内を目処にまったりと翻訳をすすめ、あわせて質を高めていこうと思っています。今のところ、<a class="reference internal" href="#id38">パースツリーを修正</a> 以降は、ざっくり訳のためにおかしな表現が多々あることにご注意ください。</p>
<p>誤訳やわかりづらいところを見つけたり、なにかご意見があるときには、近藤茂徳(<img src="sgm.png"/>)までご連絡ください。こういった翻訳をするのははじめてなので、つっこみ大歓迎です。よろしくお願いします。</p>
<p>2013年10月現在、Beautiful Soupについての日本語Webページは、Beautiful Soup 3とBeautiful Soup 4(以下、BS3,BS4)の情報が混在しています。とくに、&#8221;Beautiful Soup&#8221;で日本語ページを対象にググると、最初に表示される10件中9件がBS3による情報であるために、初心者はそのままBS3を使って混乱しがちです。ご注意ください。</p>
<p><strong>混乱しないように初心者が知っておくべきこと</strong></p>
<ul class="simple">
<li>2012年5月にBS3の開発が終了し、現在ではBS4の利用が推奨されています</li>
<li>BS3はPython3に対応していません</li>
<li>ただし、BS3のスクリプトのほとんどはimport文を変えるだけでBS4でも動きます</li>
<li>そのため、BS3による情報も問題解決の役に立ちます</li>
<li>詳しくは <a class="reference internal" href="#beautiful-soup-3">Beautiful Soup 3</a> を読んでください</li>
<li>この文書の <a class="reference internal" href="#id7">クイックスタート</a> と <a class="reference internal" href="#find-all">find_all()</a> を読めば、それなりに用は足りると思います</li>
</ul>
</div>
<div class="section" id="id3">
<h2>この文書について<a class="headerlink" href="#id3" title="Permalink to this headline">¶</a></h2>
<p>この文書は、Beautiful Soup 4 (訳注:以下BS4)の主要機能について、例を挙げて説明します。どのライブラリがよいか、どのように動くか、どのように使うか、どのようにあなたの望むことを達成するか、予想外の動きをしたときは何をすればよいかといったことを示します。</p>
<p>この文書で挙げられる例は、Python2.7と3.2のどちらでも同じように動きます。</p>
<p>あなたは <a class="reference external" href="http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html">Beautiful Soup 3 (訳注:以下BS3)の文書</a> を探しているのかもしれません。もしそうなら、BS3はすでに開発を終えていて、BS4が全てのプロジェクト対して推奨されていることを知っていてください。BS3とBS4の違いを知りたいときは、<a class="reference internal" href="#bs4">BS4への移行</a> を見てください。</p>
<p>この文書は、ユーザーにより他の言語にも翻訳されています。</p>
<ul class="simple">
<li>이 문서는 한국어 번역도 가능합니다.(<a class="reference external" href="http://coreapython.hosting.paran.com/etc/beautifulsoup4.html">외부 링크</a>)</li>
</ul>
</div>
<div class="section" id="id5">
<h2>助けてほしいときは<a class="headerlink" href="#id5" title="Permalink to this headline">¶</a></h2>
<p>Beautiful Soup について疑問が生じたり、問題に直面したときは、 <a class="reference external" href="https://groups.google.com/forum/?fromgroups#!forum/beautifulsoup">ディスカッショングループにメールしてください。</a> もし問題がHTMLのパースのことであれば、そのHTMLについて <a class="reference internal" href="#diagnose"><em>diagnose() 関数の返す内容</em></a> を必ず書くようにしてください。</p>
</div>
</div>
<div class="section" id="id7">
<h1>クイックスタート<a class="headerlink" href="#id7" title="Permalink to this headline">¶</a></h1>
<p>以下のHTMLドキュメントは、このあと何回も例として用いられます。 <strong>ふしぎの国のアリス</strong> からの引用です。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">html_doc</span> <span class="o">=</span> <span class="s">&quot;&quot;&quot;</span>
<span class="s">&lt;html&gt;&lt;head&gt;&lt;title&gt;The Dormouse&#39;s story&lt;/title&gt;&lt;/head&gt;</span>
<span class="s">&lt;body&gt;</span>
<span class="s">&lt;p class=&quot;title&quot;&gt;&lt;b&gt;The Dormouse&#39;s story&lt;/b&gt;&lt;/p&gt;</span>

<span class="s">&lt;p class=&quot;story&quot;&gt;Once upon a time there were three little sisters; and their names were</span>
<span class="s">&lt;a href=&quot;http://example.com/elsie&quot; class=&quot;sister&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;,</span>
<span class="s">&lt;a href=&quot;http://example.com/lacie&quot; class=&quot;sister&quot; id=&quot;link2&quot;&gt;Lacie&lt;/a&gt; and</span>
<span class="s">&lt;a href=&quot;http://example.com/tillie&quot; class=&quot;sister&quot; id=&quot;link3&quot;&gt;Tillie&lt;/a&gt;;</span>
<span class="s">and they lived at the bottom of a well.&lt;/p&gt;</span>

<span class="s">&lt;p class=&quot;story&quot;&gt;...&lt;/p&gt;</span>
<span class="s">&quot;&quot;&quot;</span>
</pre></div>
</div>
<p>この&#8221;three sisters&#8221;ドキュメントを Beautiful Soup にかけると、 <tt class="docutils literal"><span class="pre">Beautiful</span> <span class="pre">Soup</span></tt> オブジェクトが得られます。これは入れ子データ構造でドキュメントを表現します。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">bs4</span> <span class="kn">import</span> <span class="n">BeautifulSoup</span>
<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">html_doc</span><span class="p">)</span>

<span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">prettify</span><span class="p">())</span>
<span class="c"># &lt;html&gt;</span>
<span class="c">#  &lt;head&gt;</span>
<span class="c">#   &lt;title&gt;</span>
<span class="c">#    The Dormouse&#39;s story</span>
<span class="c">#   &lt;/title&gt;</span>
<span class="c">#  &lt;/head&gt;</span>
<span class="c">#  &lt;body&gt;</span>
<span class="c">#   &lt;p class=&quot;title&quot;&gt;</span>
<span class="c">#    &lt;b&gt;</span>
<span class="c">#     The Dormouse&#39;s story</span>
<span class="c">#    &lt;/b&gt;</span>
<span class="c">#   &lt;/p&gt;</span>
<span class="c">#   &lt;p class=&quot;story&quot;&gt;</span>
<span class="c">#    Once upon a time there were three little sisters; and their names were</span>
<span class="c">#    &lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;</span>
<span class="c">#     Elsie</span>
<span class="c">#    &lt;/a&gt;</span>
<span class="c">#    ,</span>
<span class="c">#    &lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot; id=&quot;link2&quot;&gt;</span>
<span class="c">#     Lacie</span>
<span class="c">#    &lt;/a&gt;</span>
<span class="c">#    and</span>
<span class="c">#    &lt;a class=&quot;sister&quot; href=&quot;http://example.com/tillie&quot; id=&quot;link2&quot;&gt;</span>
<span class="c">#     Tillie</span>
<span class="c">#    &lt;/a&gt;</span>
<span class="c">#    ; and they lived at the bottom of a well.</span>
<span class="c">#   &lt;/p&gt;</span>
<span class="c">#   &lt;p class=&quot;story&quot;&gt;</span>
<span class="c">#    ...</span>
<span class="c">#   &lt;/p&gt;</span>
<span class="c">#  &lt;/body&gt;</span>
<span class="c"># &lt;/html&gt;</span>
</pre></div>
</div>
<p>以下は、データ構造を探索するいくつかの方法です。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">title</span>
<span class="c"># &lt;title&gt;The Dormouse&#39;s story&lt;/title&gt;</span>

<span class="n">soup</span><span class="o">.</span><span class="n">title</span><span class="o">.</span><span class="n">name</span>
<span class="c"># u&#39;title&#39;</span>

<span class="n">soup</span><span class="o">.</span><span class="n">title</span><span class="o">.</span><span class="n">string</span>
<span class="c"># u&#39;The Dormouse&#39;s story&#39;</span>

<span class="n">soup</span><span class="o">.</span><span class="n">title</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">name</span>
<span class="c"># u&#39;head&#39;</span>

<span class="n">soup</span><span class="o">.</span><span class="n">p</span>
<span class="c"># &lt;p class=&quot;title&quot;&gt;&lt;b&gt;The Dormouse&#39;s story&lt;/b&gt;&lt;/p&gt;</span>

<span class="n">soup</span><span class="o">.</span><span class="n">p</span><span class="p">[</span><span class="s">&#39;class&#39;</span><span class="p">]</span>
<span class="c"># u&#39;title&#39;</span>

<span class="n">soup</span><span class="o">.</span><span class="n">a</span>
<span class="c"># &lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;</span>

<span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">&#39;a&#39;</span><span class="p">)</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot; id=&quot;link2&quot;&gt;Lacie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/tillie&quot; id=&quot;link3&quot;&gt;Tillie&lt;/a&gt;]</span>

<span class="n">soup</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="s">&quot;link3&quot;</span><span class="p">)</span>
<span class="c"># &lt;a class=&quot;sister&quot; href=&quot;http://example.com/tillie&quot; id=&quot;link3&quot;&gt;Tillie&lt;/a&gt;</span>
</pre></div>
</div>
<p>よくある処理として、ページの&lt;a&gt;タグ内にあるURLを全て抽出するというものがあります。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">link</span> <span class="ow">in</span> <span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">&#39;a&#39;</span><span class="p">):</span>
    <span class="k">print</span><span class="p">(</span><span class="n">link</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;href&#39;</span><span class="p">))</span>
<span class="c"># http://example.com/elsie</span>
<span class="c"># http://example.com/lacie</span>
<span class="c"># http://example.com/tillie</span>
</pre></div>
</div>
<p>また、ページからタグを除去して全テキストを抽出するという処理もあります。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">get_text</span><span class="p">())</span>
<span class="c"># The Dormouse&#39;s story</span>
<span class="c">#</span>
<span class="c"># The Dormouse&#39;s story</span>
<span class="c">#</span>
<span class="c"># Once upon a time there were three little sisters; and their names were</span>
<span class="c"># Elsie,</span>
<span class="c"># Lacie and</span>
<span class="c"># Tillie;</span>
<span class="c"># and they lived at the bottom of a well.</span>
<span class="c">#</span>
<span class="c"># ...</span>
</pre></div>
</div>
<p>必要な情報は得られましたか?つづきをどうぞ。</p>
</div>
<div class="section" id="id8">
<h1>インストール<a class="headerlink" href="#id8" title="Permalink to this headline">¶</a></h1>
<p>DebianかUbuntuの最近のバージョンを使っていれば、Beautiful Soupはシステムのパッケージマネージャでインストールできます。:</p>
<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">apt-get</span> <span class="pre">install</span> <span class="pre">python-bs4</span></tt></p>
<p>Beautiful Soup 4 は PyPiを通して公開されています。そのため、もしシステムパッケージで Beautiful Soup をインストールできないときは、<tt class="docutils literal"><span class="pre">easy_install</span></tt> か <tt class="docutils literal"><span class="pre">pip</span></tt> でインストールできます。</p>
<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">easy_install</span> <span class="pre">beautifulsoup4</span></tt></p>
<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">pip</span> <span class="pre">install</span> <span class="pre">beautifulsoup4</span></tt></p>
<p>( <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> パッケージはおそらくあなたが探しているものでは <strong>ありません</strong> 。これは、一つ前のメジャーリリース <a class="reference internal" href="#beautiful-soup-3">Beautiful Soup 3</a> です。多くのソフトウェアがBS3を使っていて、今でもBS3は利用できます。しかし、新しくコードを書く場合は、 <tt class="docutils literal"><span class="pre">beautifulsoup4</span></tt> をインストールすべきです。)</p>
<p>もし、 <tt class="docutils literal"><span class="pre">easy_install</span></tt> や <tt class="docutils literal"><span class="pre">pip</span></tt> をインストールしてないときは、<a class="reference external" href="http://www.crummy.com/software/BeautifulSoup/download/4.x/">download the Beautiful Soup 4 source tarball</a> でソースをダウンロードし <tt class="docutils literal"><span class="pre">setup.py</span></tt> を用いてインストールできます。</p>
<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">python</span> <span class="pre">setup.py</span> <span class="pre">install</span></tt></p>
<p>もしどの方法も失敗するのなら、あなたのアプリケーションにライブラリをそのままパッケージングするという手もあります。Beautiful Soupのライセンスはそれを認めています。.tar.gz形式でダウンロードし、アプリケーションのソースコード内に <tt class="docutils literal"><span class="pre">bs4</span></tt> ディレクトリをコピーしてください。そうすれば、Beautiful Soupをインストールすることなしに使うことができます。</p>
<p>私は、Python 2.7とPython 3.2でBeautiful Soupを開発しましたが、他の最近のバージョンでも動くはずです。</p>
<div class="section" id="id9">
<h2>インストール後の問題<a class="headerlink" href="#id9" title="Permalink to this headline">¶</a></h2>
<p>Beautiful SoupはPython 2のコードとしてパッケージされています。
Beautiful SoupをPython 3環境で使おうとしてインストールすると、それは自動的にPython 3のコードとして変換されます。
もし、Beautiful Soupパッケージをインストールしないと、コードは変換されません。
Windowsでは、間違ったバージョンが入っていると、それが報告されます。</p>
<p><tt class="docutils literal"><span class="pre">ImportError</span></tt> &#8220;No module named HTMLParser&#8221; というエラーが表示されたら、それはPython 3環境でPython 2で書かれたコードを実行しようとしたためです。</p>
<p><tt class="docutils literal"><span class="pre">ImportError</span></tt> &#8220;No module named html.parser&#8221; というエラーが表示されたら、それはPython 2環境でPython 3ので書かれたコードを実行しようとしたためです。</p>
<p>どちらの場合もとるべき対応は、Beautiful Soupを(tarballを解凍したときディレクトリを含め)
完全にアンインストールして、再インストールをすることです。</p>
<p><tt class="docutils literal"><span class="pre">ROOT_TAG_NAME</span> <span class="pre">=</span> <span class="pre">u'[document]'</span></tt> 行で <tt class="docutils literal"><span class="pre">SyntaxError</span></tt> &#8220;Invalid syntax&#8221; のエラーが表示されたら、
Python 2で書かれたBeautiful SoupのコードをPython 3に変換しなければいけません。</p>
<p>そのためには、次のようにパッケージをインストールするか、:</p>
<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">python3</span> <span class="pre">setup.py</span> <span class="pre">install</span></tt></p>
<p>もしくは、手動で <tt class="docutils literal"><span class="pre">2to3</span></tt> 変換スクリプトを <tt class="docutils literal"><span class="pre">bs4</span></tt> ディレクトリで実行すればできます。:</p>
<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">2to3-3.2</span> <span class="pre">-w</span> <span class="pre">bs4</span></tt></p>
</div>
<div class="section" id="parser-installation">
<span id="id10"></span><h2>パーサーのインストール<a class="headerlink" href="#parser-installation" title="Permalink to this headline">¶</a></h2>
<p>Beautiful SoupはPythonの標準ライブラリに入っているHTMLパーサーをサポートすると同時に、多くのサードパーティーのPythonパーサーもサポートしています。一つには、 <a class="reference external" href="http://lxml.de/">lxml parser</a>. があります。環境に依りますが、以下のコマンドのどれかでlxmlをインストールできるでしょう。:</p>
<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">apt-get</span> <span class="pre">install</span> <span class="pre">python-lxml</span></tt></p>
<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">easy_install</span> <span class="pre">lxml</span></tt></p>
<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">pip</span> <span class="pre">install</span> <span class="pre">lxml</span></tt></p>
<p>別の選択肢として、Python純正の <a class="reference external" href="http://code.google.com/p/html5lib/">html5lib parser</a> が挙げられます。これは HTMLをwebブラウザがするようにパースします。これも環境に依りますが、以下のコマンドのどれかでhtml5libをインストールできるでしょう。:</p>
<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">apt-get</span> <span class="pre">install</span> <span class="pre">python-html5lib</span></tt></p>
<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">easy_install</span> <span class="pre">html5lib</span></tt></p>
<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">pip</span> <span class="pre">install</span> <span class="pre">html5lib</span></tt></p>
<p>以下の表は、各パーサーのライブラリの強みと弱みをまとめてあります。</p>
<table border="1" class="docutils">
<colgroup>
<col width="17%" />
<col width="33%" />
<col width="25%" />
<col width="25%" />
</colgroup>
<tbody valign="top">
<tr class="row-odd"><td>パーサー</td>
<td>使用例</td>
<td>強み</td>
<td>弱み</td>
</tr>
<tr class="row-even"><td>Python&#8217;s html.parser</td>
<td><tt class="docutils literal"><span class="pre">BeautifulSoup(markup,</span> <span class="pre">&quot;html.parser&quot;)</span></tt></td>
<td><ul class="first last simple">
<li>標準ライブラリ</li>
<li>まずまずのスピード</li>
<li>Python2.7.3/3.2.2以降に対応</li>
</ul>
</td>
<td><ul class="first last simple">
<li>Python2.7.3/3.2.2未満は非対応</li>
</ul>
</td>
</tr>
<tr class="row-odd"><td>lxml&#8217;s HTML parser</td>
<td><tt class="docutils literal"><span class="pre">BeautifulSoup(markup,</span> <span class="pre">&quot;lxml&quot;)</span></tt></td>
<td><ul class="first last simple">
<li>爆速</li>
<li>対応(?)</li>
</ul>
</td>
<td><ul class="first last simple">
<li>外部Cライブラリに依存</li>
</ul>
</td>
</tr>
<tr class="row-even"><td>lxml&#8217;s XML parser</td>
<td><tt class="docutils literal"><span class="pre">BeautifulSoup(markup,</span> <span class="pre">[&quot;lxml&quot;,</span> <span class="pre">&quot;xml&quot;])</span></tt>
<tt class="docutils literal"><span class="pre">BeautifulSoup(markup,</span> <span class="pre">&quot;xml&quot;)</span></tt></td>
<td><ul class="first last simple">
<li>爆速</li>
<li>唯一の対応XMLパーサー</li>
</ul>
</td>
<td><ul class="first last simple">
<li>外部Cライブラリに依存</li>
</ul>
</td>
</tr>
<tr class="row-odd"><td>html5lib</td>
<td><tt class="docutils literal"><span class="pre">BeautifulSoup(markup,</span> <span class="pre">&quot;html5lib&quot;)</span></tt></td>
<td><ul class="first last simple">
<li>対応度高</li>
<li>WEBブラウザと同じようにパース</li>
<li>正しいHTML5を生成</li>
</ul>
</td>
<td><ul class="first last simple">
<li>とても遅い</li>
<li>外部Pythonライブラリに依存</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>できれば、速度のためにlxmlをインストールして使うことをお薦めします。
とくに、あなたがPython2.7.3のPython2系か、Python3.2.2より前のPython3系を使っているばあいは、lxmlかhtml5libをインストールすることは <strong>とても大事です</strong> 。
なぜなら、Pythonにはじめから組み込まれているHTMLパーサーは、古いバージョンのPythonではそこまで良く動かないからです。</p>
<p>構文が不正確なドキュメントのときは、パーサーが違うと生成されるパースツリーが異なってくることに注意してください。
詳しくは、 <a class="reference internal" href="#id47">パーサーの違い</a> を参照のこと。</p>
</div>
</div>
<div class="section" id="id11">
<h1>スープの作成<a class="headerlink" href="#id11" title="Permalink to this headline">¶</a></h1>
<p>ドキュメントをパース(構文解析)するには、
そのドキュメントを <tt class="docutils literal"><span class="pre">Beautiful</span> <span class="pre">Soup</span></tt> コンストラクタに渡します。
文字列でも開いたファイルハンドルでも渡せます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">bs4</span> <span class="kn">import</span> <span class="n">BeautifulSoup</span>

<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="s">&quot;index.html&quot;</span><span class="p">))</span>

<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">&quot;&lt;html&gt;data&lt;/html&gt;&quot;</span><span class="p">)</span>
</pre></div>
</div>
<p>最初に、ドキュメントはUnicodeに変換され、HTMLエンティティはUnicode文字列に変換されます。:</p>
<div class="highlight-python"><pre>BeautifulSoup("Sacr&amp;eacute; bleu!")
&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;Sacré bleu!&lt;/body&gt;&lt;/html&gt;</pre>
</div>
<p>Beautiful Soupは、ドキュメントをもっとも適したパーサー(構文解析器)を使ってパースします。
XMLパーサーを使うように指定しなければ、HTMLパーサーが用いられます。( <a class="reference internal" href="#xml">XMLのパース</a> を参照)</p>
</div>
<div class="section" id="id12">
<h1>4種類のオブジェクト<a class="headerlink" href="#id12" title="Permalink to this headline">¶</a></h1>
<p>Beautiful Soup は複雑なHTMLドキュメントを、Pythonオブジェクトの複雑なツリー構造に変換します。
しかし、あなたは <tt class="docutils literal"><span class="pre">Tag</span></tt>, <tt class="docutils literal"><span class="pre">NavigableString</span></tt>, <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt>, <tt class="docutils literal"><span class="pre">Comment</span></tt>
の <strong>4種類のオブジェクト</strong> だけを扱えばよいです。</p>
<div class="section" id="tag-obj">
<span id="tag"></span><h2>Tag obj.<a class="headerlink" href="#tag-obj" title="Permalink to this headline">¶</a></h2>
<p><tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトは、元のドキュメント内のXMLやHTMLのタグに対応しています。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">&#39;&lt;b class=&quot;boldest&quot;&gt;Extremely bold&lt;/b&gt;&#39;</span><span class="p">)</span>
<span class="n">tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">b</span>
<span class="nb">type</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span>
<span class="c"># &lt;class &#39;bs4.element.Tag&#39;&gt;</span>
</pre></div>
</div>
<p><tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトは、多くの属性とメソッドを持っています。それらのほとんどは、 <a class="reference internal" href="#id16">パースツリーを探索</a> と <a class="reference internal" href="#id25">パースツリーを検索</a> で説明します。この節では <tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトの重要な機能である、名前と属性について説明します。</p>
<div class="section" id="id13">
<h3>名前<a class="headerlink" href="#id13" title="Permalink to this headline">¶</a></h3>
<p>タグはそれぞれ名前を持っていますが、 <tt class="docutils literal"><span class="pre">.name</span></tt> でアクセスできます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">tag</span><span class="o">.</span><span class="n">name</span>
<span class="c"># u&#39;b&#39;</span>
</pre></div>
</div>
<p>タグの名前を変えると、その変更はBeautiful Soupが生成する全てのマークアップに反映されます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">tag</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="s">&quot;blockquote&quot;</span>
<span class="n">tag</span>
<span class="c"># &lt;blockquote class=&quot;boldest&quot;&gt;Extremely bold&lt;/blockquote&gt;</span>
</pre></div>
</div>
</div>
<div class="section" id="id14">
<h3>属性<a class="headerlink" href="#id14" title="Permalink to this headline">¶</a></h3>
<p>タグは多くの属性を持ちます。
&lt;b class=&#8221;boldest&#8221;&gt;は、&#8221;boldest&#8221;という値の&#8217;class&#8217;属性を持ちます。
<tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトを辞書のように扱うことで、そのタグの属性にアクセスできます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">tag</span><span class="p">[</span><span class="s">&#39;class&#39;</span><span class="p">]</span>
<span class="c"># u&#39;boldest&#39;</span>
</pre></div>
</div>
<p><tt class="docutils literal"><span class="pre">.attrs</span></tt> で辞書に直接アクセスできます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">tag</span><span class="o">.</span><span class="n">attrs</span>
<span class="c"># {u&#39;class&#39;: u&#39;boldest&#39;}</span>
</pre></div>
</div>
<p>繰り返しになりますが、辞書のように <tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトを扱うことにより、タグの属性に対して追加, 削除, 修正も行うことができます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">tag</span><span class="p">[</span><span class="s">&#39;class&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s">&#39;verybold&#39;</span>
<span class="n">tag</span><span class="p">[</span><span class="s">&#39;id&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">tag</span>
<span class="c"># &lt;blockquote class=&quot;verybold&quot; id=&quot;1&quot;&gt;Extremely bold&lt;/blockquote&gt;</span>

<span class="k">del</span> <span class="n">tag</span><span class="p">[</span><span class="s">&#39;class&#39;</span><span class="p">]</span>
<span class="k">del</span> <span class="n">tag</span><span class="p">[</span><span class="s">&#39;id&#39;</span><span class="p">]</span>
<span class="n">tag</span>
<span class="c"># &lt;blockquote&gt;Extremely bold&lt;/blockquote&gt;</span>

<span class="n">tag</span><span class="p">[</span><span class="s">&#39;class&#39;</span><span class="p">]</span>
<span class="c"># KeyError: &#39;class&#39;</span>
<span class="k">print</span><span class="p">(</span><span class="n">tag</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;class&#39;</span><span class="p">))</span>
<span class="c"># None</span>
</pre></div>
</div>
<span class="target" id="multivalue"></span><div class="section" id="id15">
<h4>値が複数のとき<a class="headerlink" href="#id15" title="Permalink to this headline">¶</a></h4>
<p>HTML4は、値を複数もてる2,3の属性を定義しています。
HTML5で、それらはなくなりましたが、別の同様の属性が定義されました。
もっとも一般的な値を複数もつ属性は <tt class="docutils literal"><span class="pre">class</span></tt> です。(たとえば、HTMLタグは複数のCSSクラスを持つことができます)
また他の複数の値を持つ属性としては、 <tt class="docutils literal"><span class="pre">rel</span></tt>, <tt class="docutils literal"><span class="pre">rev</span></tt>, <tt class="docutils literal"><span class="pre">accept-charset</span></tt>, <tt class="docutils literal"><span class="pre">headers</span></tt>, <tt class="docutils literal"><span class="pre">accesskey</span></tt> があります。
Beautiful Soupは、これらの属性がもつ複数の値をリストとして示します。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">css_soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">&#39;&lt;p class=&quot;body strikeout&quot;&gt;&lt;/p&gt;&#39;</span><span class="p">)</span>
<span class="n">css_soup</span><span class="o">.</span><span class="n">p</span><span class="p">[</span><span class="s">&#39;class&#39;</span><span class="p">]</span>
<span class="c"># [&quot;body&quot;, &quot;strikeout&quot;]</span>

<span class="n">css_soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">&#39;&lt;p class=&quot;body&quot;&gt;&lt;/p&gt;&#39;</span><span class="p">)</span>
<span class="n">css_soup</span><span class="o">.</span><span class="n">p</span><span class="p">[</span><span class="s">&#39;class&#39;</span><span class="p">]</span>
<span class="c"># [&quot;body&quot;]</span>
</pre></div>
</div>
<p>ある属性が複数の値をもっているようでも、HTML標準の定義から外れている場合、Beautiful Soupはその属性をひとまとまりの値として扱います。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">id_soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">&#39;&lt;p id=&quot;my id&quot;&gt;&lt;/p&gt;&#39;</span><span class="p">)</span>
<span class="n">id_soup</span><span class="o">.</span><span class="n">p</span><span class="p">[</span><span class="s">&#39;id&#39;</span><span class="p">]</span>
<span class="c"># &#39;my id&#39;</span>
</pre></div>
</div>
<p>タグを文字列に変換したときは、これらの属性の複数の値は一つにまとめられます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">rel_soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">&#39;&lt;p&gt;Back to the &lt;a rel=&quot;index&quot;&gt;homepage&lt;/a&gt;&lt;/p&gt;&#39;</span><span class="p">)</span>
<span class="n">rel_soup</span><span class="o">.</span><span class="n">a</span><span class="p">[</span><span class="s">&#39;rel&#39;</span><span class="p">]</span>
<span class="c"># [&#39;index&#39;]</span>
<span class="n">rel_soup</span><span class="o">.</span><span class="n">a</span><span class="p">[</span><span class="s">&#39;rel&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;index&#39;</span><span class="p">,</span> <span class="s">&#39;contents&#39;</span><span class="p">]</span>
<span class="k">print</span><span class="p">(</span><span class="n">rel_soup</span><span class="o">.</span><span class="n">p</span><span class="p">)</span>
<span class="c"># &lt;p&gt;Back to the &lt;a rel=&quot;index contents&quot;&gt;homepage&lt;/a&gt;&lt;/p&gt;</span>
</pre></div>
</div>
<p>ドキュメントをXMLとしてパースすると、値を複数もつ属性はなくなります。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">xml_soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">&#39;&lt;p class=&quot;body strikeout&quot;&gt;&lt;/p&gt;&#39;</span><span class="p">,</span> <span class="s">&#39;xml&#39;</span><span class="p">)</span>
<span class="n">xml_soup</span><span class="o">.</span><span class="n">p</span><span class="p">[</span><span class="s">&#39;class&#39;</span><span class="p">]</span>
<span class="c"># u&#39;body strikeout&#39;</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="section" id="navigablestring-obj">
<h2>NavigableString obj.<a class="headerlink" href="#navigablestring-obj" title="Permalink to this headline">¶</a></h2>
<p>タグの組に挟まれる短い(ドキュメントの本文のテキスト)文字列があります。
Beautiful Soupは、これらの文字列を表すのに <tt class="docutils literal"><span class="pre">NavigableString</span></tt> クラスを用います。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">tag</span><span class="o">.</span><span class="n">string</span>
<span class="c"># u&#39;Extremely bold&#39;</span>
<span class="nb">type</span><span class="p">(</span><span class="n">tag</span><span class="o">.</span><span class="n">string</span><span class="p">)</span>
<span class="c"># &lt;class &#39;bs4.element.NavigableString&#39;&gt;</span>
</pre></div>
</div>
<p><tt class="docutils literal"><span class="pre">NavigableString</span></tt> オブジェクトは、PythonのUnicode型のように振るまいます。
また、<a class="reference internal" href="#id16">パースツリーを探索</a> と <a class="reference internal" href="#id25">パースツリーを検索</a> に述べられている機能のいくつかもサポートします。
<tt class="docutils literal"><span class="pre">unicode()</span></tt> を用いて、 <tt class="docutils literal"><span class="pre">NavigableString</span></tt> オブジェクトをUnicode型に変換できます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">unicode_string</span> <span class="o">=</span> <span class="nb">unicode</span><span class="p">(</span><span class="n">tag</span><span class="o">.</span><span class="n">string</span><span class="p">)</span>
<span class="n">unicode_string</span>
<span class="c"># u&#39;Extremely bold&#39;</span>
<span class="nb">type</span><span class="p">(</span><span class="n">unicode_string</span><span class="p">)</span>
<span class="c"># &lt;type &#39;unicode&#39;&gt;</span>
</pre></div>
</div>
<p><tt class="docutils literal"><span class="pre">NavigableString</span></tt> の文字列は編集できませんが、 <a class="reference internal" href="#replace-with"><em>replace_with()</em></a> を使って、他の文字列に置換することはできます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">tag</span><span class="o">.</span><span class="n">string</span><span class="o">.</span><span class="n">replace_with</span><span class="p">(</span><span class="s">&quot;No longer bold&quot;</span><span class="p">)</span>
<span class="n">tag</span>
<span class="c"># &lt;blockquote&gt;No longer bold&lt;/blockquote&gt;</span>
</pre></div>
</div>
<p><tt class="docutils literal"><span class="pre">NavigableString</span></tt> は、<a class="reference internal" href="#id16">パースツリーを探索</a> と <a class="reference internal" href="#id25">パースツリーを検索</a> で述べられている機能のほとんどをサポートします。
しかし、全てをサポートしているわけではありません。
とくに、<tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトが文字列や別の <tt class="docutils literal"><span class="pre">Tag</span></tt> を内に含むのに対して、<tt class="docutils literal"><span class="pre">string</span></tt> オブジェクトは何も持たず、<cite>.contents`</cite> 属性, <tt class="docutils literal"><span class="pre">.string</span></tt> 属性, <tt class="docutils literal"><span class="pre">find()</span></tt> メソッドをサポートしません。</p>
<p><tt class="docutils literal"><span class="pre">NavigableString</span></tt> をBeautiful Soupの外で使いたい場合は、 <tt class="docutils literal"><span class="pre">unicode()</span></tt> を使ってPythonのUnicode文字列に変換するべきです。そうしないと、Beautiful Soupを使い終わった後も、Beautiful Soupのパースツリー全体へのリファレンスを持ち続けることになり、メモリを大量に浪費します。</p>
</div>
<div class="section" id="beautifulsoup-obj">
<h2>BeautifulSoup obj.<a class="headerlink" href="#beautifulsoup-obj" title="Permalink to this headline">¶</a></h2>
<p><tt class="docutils literal"><span class="pre">Beautiful</span> <span class="pre">Soup</span></tt> オブジェクトは、それ自身で元のドキュメント全体を表しています。
たいていの場合、<a class="reference internal" href="#tag"><em>Tag obj.</em></a> を扱うことで、用は足りるでしょう。
これは、<a class="reference internal" href="#tag"><em>Tag obj.</em></a> が <a class="reference internal" href="#id16">パースツリーを探索</a> と <a class="reference internal" href="#id25">パースツリーを検索</a>. で述べられているメソッドの多くをサポートしているということです。</p>
<p><tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> オブジェクトは、実際のHTMLやXMLタグに対応していないので、名前や属性を持たない。
しかし、 <tt class="docutils literal"><span class="pre">.name</span></tt> をみるような便利なものはいくつかある。そして、それらは特別な <tt class="docutils literal"><span class="pre">.name</span></tt> &#8220;[document]&#8221;を得られる(?訳がおかしい。けど次回まわし?):</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">name</span>
<span class="c"># u&#39;[document]&#39;</span>
</pre></div>
</div>
</div>
<div class="section" id="comments-obj">
<h2>Comments obj. 他<a class="headerlink" href="#comments-obj" title="Permalink to this headline">¶</a></h2>
<p><tt class="docutils literal"><span class="pre">Tag</span></tt>, <tt class="docutils literal"><span class="pre">NavigableString</span></tt>, <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> はHTMLやXMLファイルのほぼ全てをカバーします。しかし、少しだけ残ったものがあります。それはコメントについてです。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">markup</span> <span class="o">=</span> <span class="s">&quot;&lt;b&gt;&lt;!--Hey, buddy. Want to buy a used parser?--&gt;&lt;/b&gt;&quot;</span>
<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">markup</span><span class="p">)</span>
<span class="n">comment</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">b</span><span class="o">.</span><span class="n">string</span>
<span class="nb">type</span><span class="p">(</span><span class="n">comment</span><span class="p">)</span>
<span class="c"># &lt;class &#39;bs4.element.Comment&#39;&gt;</span>
</pre></div>
</div>
<p><tt class="docutils literal"><span class="pre">Comment</span></tt> オブジェクトは、 <tt class="docutils literal"><span class="pre">NavigableString</span></tt> オブジェクトの特別なタイプです。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">comment</span>
<span class="c"># u&#39;Hey, buddy. Want to buy a used parser&#39;</span>
</pre></div>
</div>
<p>コメントはHTMLの中にあらわれますが、 <tt class="docutils literal"><span class="pre">Comment</span></tt> は特別な書式で表示されます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">b</span><span class="o">.</span><span class="n">prettify</span><span class="p">())</span>
<span class="c"># &lt;b&gt;</span>
<span class="c">#  &lt;!--Hey, buddy. Want to buy a used parser?--&gt;</span>
<span class="c"># &lt;/b&gt;</span>
</pre></div>
</div>
<p>Beautiful Soupは、XMLドキュメントのなかの他の全ての要素をクラス定義しています。
<tt class="docutils literal"><span class="pre">CData</span></tt>, <tt class="docutils literal"><span class="pre">ProcessingInstruction</span></tt>, <tt class="docutils literal"><span class="pre">Declaration</span></tt>, <tt class="docutils literal"><span class="pre">Doctype</span></tt>.
<tt class="docutils literal"><span class="pre">Comment</span></tt> クラスのように、これらは文字に何かを加えた <tt class="docutils literal"><span class="pre">NavigableString</span></tt> のサブクラスです。
ここでは、コメントをCDDATAブロックに置換した例を示します。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">bs4</span> <span class="kn">import</span> <span class="n">CData</span>
<span class="n">cdata</span> <span class="o">=</span> <span class="n">CData</span><span class="p">(</span><span class="s">&quot;A CDATA block&quot;</span><span class="p">)</span>
<span class="n">comment</span><span class="o">.</span><span class="n">replace_with</span><span class="p">(</span><span class="n">cdata</span><span class="p">)</span>

<span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">b</span><span class="o">.</span><span class="n">prettify</span><span class="p">())</span>
<span class="c"># &lt;b&gt;</span>
<span class="c">#  &lt;![CDATA[A CDATA block]]&gt;</span>
<span class="c"># &lt;/b&gt;</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="id16">
<h1>パースツリーを探索<a class="headerlink" href="#id16" title="Permalink to this headline">¶</a></h1>
<p>ここで再び &#8220;Three sisters&#8221; のHTMLドキュメントです。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">html_doc</span> <span class="o">=</span> <span class="s">&quot;&quot;&quot;</span>
<span class="s">&lt;html&gt;&lt;head&gt;&lt;title&gt;The Dormouse&#39;s story&lt;/title&gt;&lt;/head&gt;</span>

<span class="s">&lt;p class=&quot;title&quot;&gt;&lt;b&gt;The Dormouse&#39;s story&lt;/b&gt;&lt;/p&gt;</span>

<span class="s">&lt;p class=&quot;story&quot;&gt;Once upon a time there were three little sisters; and their names were</span>
<span class="s">&lt;a href=&quot;http://example.com/elsie&quot; class=&quot;sister&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;,</span>
<span class="s">&lt;a href=&quot;http://example.com/lacie&quot; class=&quot;sister&quot; id=&quot;link2&quot;&gt;Lacie&lt;/a&gt; and</span>
<span class="s">&lt;a href=&quot;http://example.com/tillie&quot; class=&quot;sister&quot; id=&quot;link3&quot;&gt;Tillie&lt;/a&gt;;</span>
<span class="s">and they lived at the bottom of a well.&lt;/p&gt;</span>

<span class="s">&lt;p class=&quot;story&quot;&gt;...&lt;/p&gt;</span>
<span class="s">&quot;&quot;&quot;</span>

<span class="kn">from</span> <span class="nn">bs4</span> <span class="kn">import</span> <span class="n">BeautifulSoup</span>
<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">html_doc</span><span class="p">)</span>
</pre></div>
</div>
<p>ドキュメントのある部分から他の部分へどのように移動するかを示すために、このドキュメントを例に使っていきます。</p>
<div class="section" id="id17">
<h2>子要素へ下移動<a class="headerlink" href="#id17" title="Permalink to this headline">¶</a></h2>
<p>タグはその間に(ドキュメント本文のテキスト)文字列や他のタグを挟んでいます。これらの要素は、 タグの <cite>子要素</cite> です。Beautiful Soupは、タグの子要素を探索し扱うための多くの属性を提供します。</p>
<p>Beautiful Soupの文字列は、これらの属性をサポートしません。なぜなら、文字列は子要素をもたないからです。</p>
<div class="section" id="id18">
<h3>タグ名で探索<a class="headerlink" href="#id18" title="Permalink to this headline">¶</a></h3>
<p>パースツリーを探索する一番簡単な方法は、あなたが取得したいタグの名前を使うことです。
もし、&lt;head&gt; タグを取得したければ、 <tt class="docutils literal"><span class="pre">soup.head</span></tt> と入力すればよいです。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">head</span>
<span class="c"># &lt;head&gt;&lt;title&gt;The Dormouse&#39;s story&lt;/title&gt;&lt;/head&gt;</span>

<span class="n">soup</span><span class="o">.</span><span class="n">title</span>
<span class="c"># &lt;title&gt;The Dormouse&#39;s story&lt;/title&gt;</span>
</pre></div>
</div>
<p>また、パースツリーのある部分から出発して、何度もズームインを繰り返す方法もあります。
このコードは、&lt;body&gt;タグ以下の最初の&lt;b&gt;タグを取得します。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">b</span>
<span class="c"># &lt;b&gt;The Dormouse&#39;s story&lt;/b&gt;</span>
</pre></div>
</div>
<p>属性としてタグ名を使うと、その名前のタグのうち <cite>最初</cite> にあるものを取得できます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">a</span>
<span class="c"># &lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;</span>
</pre></div>
</div>
<p><cite>全ての</cite> &lt;a&gt;タグを取得したいときや、ある名前のタグのうち2番目以降のものをしたいときは、  <a class="reference internal" href="#id25">パースツリーを検索</a> で述べられている <cite>find_all()</cite> のようなメソッドを使う必要があります。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">&#39;a&#39;</span><span class="p">)</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot; id=&quot;link2&quot;&gt;Lacie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/tillie&quot; id=&quot;link3&quot;&gt;Tillie&lt;/a&gt;]</span>
</pre></div>
</div>
</div>
<div class="section" id="contents-children">
<h3><tt class="docutils literal"><span class="pre">.contents</span></tt> / <tt class="docutils literal"><span class="pre">.children</span></tt><a class="headerlink" href="#contents-children" title="Permalink to this headline">¶</a></h3>
<p>タグの子要素は、 <tt class="docutils literal"><span class="pre">.contents</span></tt> で呼び出すと、リストで取得できます。:</p>
<div class="highlight-python"><pre>head_tag = soup.head
head_tag
# &lt;head&gt;&lt;title&gt;The Dormouse's story&lt;/title&gt;&lt;/head&gt;

head_tag.contents
[&lt;title&gt;The Dormouse's story&lt;/title&gt;]

title_tag = head_tag.contents[0]
title_tag
# &lt;title&gt;The Dormouse's story&lt;/title&gt;
title_tag.contents
# [u'The Dormouse's story']</pre>
</div>
<p><tt class="docutils literal"><span class="pre">Beautiful</span> <span class="pre">Soup</span></tt> オブジェクトは、それ自身が子要素を持ちます。この場合、&lt;html&gt;タグが <tt class="docutils literal"><span class="pre">Beautiful</span> <span class="pre">Soup</span></tt> オブジェクトの子要素になります。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="nb">len</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">contents</span><span class="p">)</span>
<span class="c"># 1</span>
<span class="n">soup</span><span class="o">.</span><span class="n">contents</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">name</span>
<span class="c"># u&#39;html&#39;</span>
</pre></div>
</div>
<p>文字列は <tt class="docutils literal"><span class="pre">.contents</span></tt> を持ちません。なぜなら、文字列は何も挟まないからです。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">text</span> <span class="o">=</span> <span class="n">title_tag</span><span class="o">.</span><span class="n">contents</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">text</span><span class="o">.</span><span class="n">contents</span>
<span class="c"># AttributeError: &#39;NavigableString&#39; object has no attribute &#39;contents&#39;</span>
</pre></div>
</div>
<p>タグの子要素を、リストの代わりに、 <cite>.children</cite> ジェネレーターを用いてイテレーターで扱うこともできます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">child</span> <span class="ow">in</span> <span class="n">title_tag</span><span class="o">.</span><span class="n">children</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="n">child</span><span class="p">)</span>
<span class="c"># The Dormouse&#39;s story</span>
</pre></div>
</div>
</div>
<div class="section" id="descendants">
<h3><tt class="docutils literal"><span class="pre">.descendants</span></tt><a class="headerlink" href="#descendants" title="Permalink to this headline">¶</a></h3>
<p><tt class="docutils literal"><span class="pre">.contents</span></tt> と <tt class="docutils literal"><span class="pre">.children</span></tt> 属性は、あるタグの <cite>直下の</cite> 子要素のみを表します。
例えば、&lt;head&gt;タグは、ただ一つの直下の子要素である&lt;title&gt;タグを持ちます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">head_tag</span><span class="o">.</span><span class="n">contents</span>
<span class="c"># [&lt;title&gt;The Dormouse&#39;s story&lt;/title&gt;]</span>
</pre></div>
</div>
<p>しかし、この&lt;title&gt;タグ自身も、子要素に&#8221;The Dormouse&#8217;s story&#8221;文字列を持ちます。
この文字列もまた、&lt;head&gt;タグの子要素であるという意味になります。
そこで、 <tt class="docutils literal"><span class="pre">.descendants</span></tt> (子孫) 属性を用いると、 あるタグの <strong>全ての</strong> 子要素を再帰的に取り出すことができます。
再帰的というのは、直下の子要素、そのまた子要素、そしてさらにといったふうに繰り返してということです。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">child</span> <span class="ow">in</span> <span class="n">head_tag</span><span class="o">.</span><span class="n">descendants</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="n">child</span><span class="p">)</span>
<span class="c"># &lt;title&gt;The Dormouse&#39;s story&lt;/title&gt;</span>
<span class="c"># The Dormouse&#39;s story</span>
</pre></div>
</div>
<p>このドキュメントの&lt;head&gt;タグはただ1つの子要素しか持ちませんが、
&lt;title&gt;タグと&lt;title&gt;タグの子要素という2つの子孫要素を持ちます。
また、このドキュメントの <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> オブジェクトには、
直下の子要素は&lt;html&gt;タグ1つしかありませんが、子孫要素はたくさんあります。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="nb">len</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">children</span><span class="p">))</span>
<span class="c"># 1</span>
<span class="nb">len</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">descendants</span><span class="p">))</span>
<span class="c"># 25</span>
</pre></div>
</div>
</div>
<div class="section" id="string">
<span id="id19"></span><h3><tt class="docutils literal"><span class="pre">.string</span></tt><a class="headerlink" href="#string" title="Permalink to this headline">¶</a></h3>
<p>ある <tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトが1つだけ子要素をもっていて、その子要素が <tt class="docutils literal"><span class="pre">NavigableString</span></tt> オブジェクトならば、 <tt class="docutils literal"><span class="pre">.string</span></tt> 属性で利用できます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">title_tag</span><span class="o">.</span><span class="n">string</span>
<span class="c"># u&#39;The Dormouse&#39;s story&#39;</span>
</pre></div>
</div>
<p>ある <tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトのただ1つの子要素が、別の <tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトであって <tt class="docutils literal"><span class="pre">.string</span></tt> 属性を持つならば、元の <tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトも同じ <tt class="docutils literal"><span class="pre">.string</span></tt> 属性を持つと考えられます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">head_tag</span><span class="o">.</span><span class="n">contents</span>
<span class="c"># [&lt;title&gt;The Dormouse&#39;s story&lt;/title&gt;]</span>

<span class="n">head_tag</span><span class="o">.</span><span class="n">string</span>
<span class="c"># u&#39;The Dormouse&#39;s story&#39;</span>
</pre></div>
</div>
<p>ある <tt class="docutils literal"><span class="pre">tag</span></tt> オブジェクトが複数の子要素を持ち、 <tt class="docutils literal"><span class="pre">.string</span></tt> 属性がどの子要素を参照しているかわからないとき、 <tt class="docutils literal"><span class="pre">.string</span></tt> 属性は <tt class="docutils literal"><span class="pre">None</span></tt> と定義されます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">html</span><span class="o">.</span><span class="n">string</span><span class="p">)</span>
<span class="c"># None</span>
</pre></div>
</div>
</div>
<div class="section" id="strings-stripped-strings">
<span id="string-generators"></span><h3><tt class="docutils literal"><span class="pre">.strings</span></tt> / <tt class="docutils literal"><span class="pre">.stripped_strings</span></tt><a class="headerlink" href="#strings-stripped-strings" title="Permalink to this headline">¶</a></h3>
<p>あるタグの中にあるドキュメント本文が要素が複数であっても、それらの文字列をみることができます。
その場合は、 <tt class="docutils literal"><span class="pre">.strings</span></tt> ジェネレーターを使用します。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">string</span> <span class="ow">in</span> <span class="n">soup</span><span class="o">.</span><span class="n">strings</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">string</span><span class="p">))</span>
<span class="c"># u&quot;The Dormouse&#39;s story&quot;</span>
<span class="c"># u&#39;\n\n&#39;</span>
<span class="c"># u&quot;The Dormouse&#39;s story&quot;</span>
<span class="c"># u&#39;\n\n&#39;</span>
<span class="c"># u&#39;Once upon a time there were three little sisters; and their names were\n&#39;</span>
<span class="c"># u&#39;Elsie&#39;</span>
<span class="c"># u&#39;,\n&#39;</span>
<span class="c"># u&#39;Lacie&#39;</span>
<span class="c"># u&#39; and\n&#39;</span>
<span class="c"># u&#39;Tillie&#39;</span>
<span class="c"># u&#39;;\nand they lived at the bottom of a well.&#39;</span>
<span class="c"># u&#39;\n\n&#39;</span>
<span class="c"># u&#39;...&#39;</span>
<span class="c"># u&#39;\n&#39;</span>
</pre></div>
</div>
<p>これらの文字列は、大量の余計な空白が入りがちである。
そこで、 <tt class="docutils literal"><span class="pre">.stripped_strings</span></tt> ジェネレーターを代わりに用いることで、それら空白を除くことができる。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">string</span> <span class="ow">in</span> <span class="n">soup</span><span class="o">.</span><span class="n">stripped_strings</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">string</span><span class="p">))</span>
<span class="c"># u&quot;The Dormouse&#39;s story&quot;</span>
<span class="c"># u&quot;The Dormouse&#39;s story&quot;</span>
<span class="c"># u&#39;Once upon a time there were three little sisters; and their names were&#39;</span>
<span class="c"># u&#39;Elsie&#39;</span>
<span class="c"># u&#39;,&#39;</span>
<span class="c"># u&#39;Lacie&#39;</span>
<span class="c"># u&#39;and&#39;</span>
<span class="c"># u&#39;Tillie&#39;</span>
<span class="c"># u&#39;;\nand they lived at the bottom of a well.&#39;</span>
<span class="c"># u&#39;...&#39;</span>
</pre></div>
</div>
<p>ここでは、文字列中に入る空白はそのままで、文字列の最初や最後に付く空白は削除されます。</p>
</div>
</div>
<div class="section" id="id20">
<h2>親要素へ上移動<a class="headerlink" href="#id20" title="Permalink to this headline">¶</a></h2>
<p>&#8220;家族ツリー&#8221;に例えると、全てのタグや文字列はそれぞれが一つの親要素を持ちます。</p>
<div class="section" id="parent">
<span id="id21"></span><h3><tt class="docutils literal"><span class="pre">.parent</span></tt><a class="headerlink" href="#parent" title="Permalink to this headline">¶</a></h3>
<p><tt class="docutils literal"><span class="pre">.parent</span></tt> 属性で親要素にアクセスできます。
たとえば、&#8221;three sisters&#8221;ドキュメントでは、&lt;head&gt;タグは&lt;title&gt;タグの親要素です。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">title_tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">title</span>
<span class="n">title_tag</span>
<span class="c"># &lt;title&gt;The Dormouse&#39;s story&lt;/title&gt;</span>
<span class="n">title_tag</span><span class="o">.</span><span class="n">parent</span>
<span class="c"># &lt;head&gt;&lt;title&gt;The Dormouse&#39;s story&lt;/title&gt;&lt;/head&gt;</span>
</pre></div>
</div>
<p>タイトル文字列はそれ自身が親要素を持ち、&lt;title&gt;タグはタイトル文字列を子要素に持ちます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">title_tag</span><span class="o">.</span><span class="n">string</span><span class="o">.</span><span class="n">parent</span>
<span class="c"># &lt;title&gt;The Dormouse&#39;s story&lt;/title&gt;</span>
</pre></div>
</div>
<p>&lt;html&gt;タグの様なトップレベルのタグは、 <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> オブジェクトそれ自身になります。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">html_tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">html</span>
<span class="nb">type</span><span class="p">(</span><span class="n">html_tag</span><span class="o">.</span><span class="n">parent</span><span class="p">)</span>
<span class="c"># &lt;class &#39;bs4.BeautifulSoup&#39;&gt;</span>
</pre></div>
</div>
<p>そして、<tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> オブジェクトの <tt class="docutils literal"><span class="pre">.parent</span></tt> 属性は、Noneになります。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">parent</span><span class="p">)</span>
<span class="c"># None</span>
</pre></div>
</div>
</div>
<div class="section" id="parents">
<span id="id22"></span><h3><tt class="docutils literal"><span class="pre">.parents</span></tt><a class="headerlink" href="#parents" title="Permalink to this headline">¶</a></h3>
<p>あるタグに対する祖先要素全てを <tt class="docutils literal"><span class="pre">.parents</span></tt> で取得することができます。
以下は、HTMLドキュメントの深いところにある&lt;a&gt;タグからスタートして、最上層まで辿っています。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">link</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">a</span>
<span class="n">link</span>
<span class="c"># &lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;</span>
<span class="k">for</span> <span class="n">parent</span> <span class="ow">in</span> <span class="n">link</span><span class="o">.</span><span class="n">parents</span><span class="p">:</span>
    <span class="k">if</span> <span class="n">parent</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
        <span class="k">print</span><span class="p">(</span><span class="n">parent</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="k">print</span><span class="p">(</span><span class="n">parent</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="c"># p</span>
<span class="c"># body</span>
<span class="c"># html</span>
<span class="c"># [document]</span>
<span class="c"># None</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="id23">
<h2>兄弟要素へ横移動<a class="headerlink" href="#id23" title="Permalink to this headline">¶</a></h2>
<p>以下のようなシンプルなHTMLドキュメントを考えてみましょう。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">sibling_soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">&quot;&lt;a&gt;&lt;b&gt;text1&lt;/b&gt;&lt;c&gt;text2&lt;/c&gt;&lt;/b&gt;&lt;/a&gt;&quot;</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">sibling_soup</span><span class="o">.</span><span class="n">prettify</span><span class="p">())</span>
<span class="c"># &lt;html&gt;</span>
<span class="c">#  &lt;body&gt;</span>
<span class="c">#   &lt;a&gt;</span>
<span class="c">#    &lt;b&gt;</span>
<span class="c">#     text1</span>
<span class="c">#    &lt;/b&gt;</span>
<span class="c">#    &lt;c&gt;</span>
<span class="c">#     text2</span>
<span class="c">#    &lt;/c&gt;</span>
<span class="c">#   &lt;/a&gt;</span>
<span class="c">#  &lt;/body&gt;</span>
<span class="c"># &lt;/html&gt;</span>
</pre></div>
</div>
<p>&lt;b&gt;タグは&lt;c&gt;タグと同じレベルにあります。つまり、2つはともに同じタグの直下の子要素ということです。
こういった関係にあるタグを <cite>siblings</cite> (兄弟)といいます。
HTMLドキュメントをきれいに出力(?)したとき、siblingsは同じインデントレベルになります。
こういったタグの関係をコードで利用することができます。</p>
<div class="section" id="next-sibling-previous-sibling">
<h3><tt class="docutils literal"><span class="pre">.next_sibling</span></tt> / <tt class="docutils literal"><span class="pre">.previous_sibling</span></tt><a class="headerlink" href="#next-sibling-previous-sibling" title="Permalink to this headline">¶</a></h3>
<p><tt class="docutils literal"><span class="pre">.next_sibling</span></tt> と <tt class="docutils literal"><span class="pre">.previous_sibling</span></tt> を用いて、パースツリーの同じレベルの要素間を辿ることができます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">sibling_soup</span><span class="o">.</span><span class="n">b</span><span class="o">.</span><span class="n">next_sibling</span>
<span class="c"># &lt;c&gt;text2&lt;/c&gt;</span>

<span class="n">sibling_soup</span><span class="o">.</span><span class="n">c</span><span class="o">.</span><span class="n">previous_sibling</span>
<span class="c"># &lt;b&gt;text1&lt;/b&gt;</span>
</pre></div>
</div>
<p>この&lt;b&gt;タグは <tt class="docutils literal"><span class="pre">.next_sibling</span></tt> は持ちますが、 <tt class="docutils literal"><span class="pre">.previous_sibling</span></tt> は持ちません。
なぜなら、&lt;b&gt;タグの前にはパースツリーで同レベルの要素がないからです。
同様に、&lt;c&gt;タグは <tt class="docutils literal"><span class="pre">.previous_sibling</span></tt> を持ちますが、<tt class="docutils literal"><span class="pre">.next_sibling</span></tt> は持ちません。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">print</span><span class="p">(</span><span class="n">sibling_soup</span><span class="o">.</span><span class="n">b</span><span class="o">.</span><span class="n">previous_sibling</span><span class="p">)</span>
<span class="c"># None</span>
<span class="k">print</span><span class="p">(</span><span class="n">sibling_soup</span><span class="o">.</span><span class="n">c</span><span class="o">.</span><span class="n">next_sibling</span><span class="p">)</span>
<span class="c"># None</span>
</pre></div>
</div>
<p>&#8220;text1&#8221;と&#8221;text&#8221;は兄弟ではありません。なぜなら、2つは同じ親をもたないからです。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">sibling_soup</span><span class="o">.</span><span class="n">b</span><span class="o">.</span><span class="n">string</span>
<span class="c"># u&#39;text1&#39;</span>

<span class="k">print</span><span class="p">(</span><span class="n">sibling_soup</span><span class="o">.</span><span class="n">b</span><span class="o">.</span><span class="n">string</span><span class="o">.</span><span class="n">next_sibling</span><span class="p">)</span>
<span class="c"># None</span>
</pre></div>
</div>
<p>実際のHTMLドキュメントをパースすると、 <tt class="docutils literal"><span class="pre">.next_sibling</span></tt> や <tt class="docutils literal"><span class="pre">.previous_sibling</span></tt> は前後に空白を持ちます。
&#8220;three sisters&#8221;ドキュメントで見てみましょう。:</p>
<div class="highlight-python"><pre>&lt;a href="http://example.com/elsie" class="sister" id="link1"&gt;Elsie&lt;/a&gt;
&lt;a href="http://example.com/lacie" class="sister" id="link2"&gt;Lacie&lt;/a&gt;
&lt;a href="http://example.com/tillie" class="sister" id="link3"&gt;Tillie&lt;/a&gt;</pre>
</div>
<p>すなおに考えれば、最初の&lt;a&gt;タグの <tt class="docutils literal"><span class="pre">.next_sibling</span></tt> は2番目の&lt;a&gt;タグとなるはずですが、実際は違います。
それは、最初の&lt;a&gt;タグと2番目を分ける&#8221;コンマと改行コード&#8221;という文字列になります。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">link</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">a</span>
<span class="n">link</span>
<span class="c"># &lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;</span>

<span class="n">link</span><span class="o">.</span><span class="n">next_sibling</span>
<span class="c"># u&#39;,\n&#39;</span>
</pre></div>
</div>
<p>2番目の&lt;a&gt;タグは、そのコンマと改行コードの <tt class="docutils literal"><span class="pre">.next_sibling</span></tt> になります。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">link</span><span class="o">.</span><span class="n">next_sibling</span><span class="o">.</span><span class="n">next_sibling</span>
<span class="c"># &lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot; id=&quot;link2&quot;&gt;Lacie&lt;/a&gt;</span>
</pre></div>
</div>
</div>
<div class="section" id="next-siblings-previous-siblings">
<span id="sibling-generators"></span><h3><tt class="docutils literal"><span class="pre">.next_siblings</span></tt> / <tt class="docutils literal"><span class="pre">.previous_siblings</span></tt><a class="headerlink" href="#next-siblings-previous-siblings" title="Permalink to this headline">¶</a></h3>
<p>複数の兄弟要素を <tt class="docutils literal"><span class="pre">.next_siblings</span></tt> や <tt class="docutils literal"><span class="pre">.previous_siblings</span></tt> をイテレーターとして使って、まとめて扱えます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">sibling</span> <span class="ow">in</span> <span class="n">soup</span><span class="o">.</span><span class="n">a</span><span class="o">.</span><span class="n">next_siblings</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">sibling</span><span class="p">))</span>
<span class="c"># u&#39;,\n&#39;</span>
<span class="c"># &lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot; id=&quot;link2&quot;&gt;Lacie&lt;/a&gt;</span>
<span class="c"># u&#39; and\n&#39;</span>
<span class="c"># &lt;a class=&quot;sister&quot; href=&quot;http://example.com/tillie&quot; id=&quot;link3&quot;&gt;Tillie&lt;/a&gt;</span>
<span class="c"># u&#39;; and they lived at the bottom of a well.&#39;</span>
<span class="c"># None</span>

<span class="k">for</span> <span class="n">sibling</span> <span class="ow">in</span> <span class="n">soup</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="s">&quot;link3&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">previous_siblings</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">sibling</span><span class="p">))</span>
<span class="c"># &#39; and\n&#39;</span>
<span class="c"># &lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot; id=&quot;link2&quot;&gt;Lacie&lt;/a&gt;</span>
<span class="c"># u&#39;,\n&#39;</span>
<span class="c"># &lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;</span>
<span class="c"># u&#39;Once upon a time there were three little sisters; and their names were\n&#39;</span>
<span class="c"># None</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="id24">
<h2>前後の要素へ移動<a class="headerlink" href="#id24" title="Permalink to this headline">¶</a></h2>
<p>&#8220;three sisters&#8221;ドキュメントのはじめの部分を見てみましょう。:</p>
<div class="highlight-python"><pre>&lt;html&gt;&lt;head&gt;&lt;title&gt;The Dormouse's story&lt;/title&gt;&lt;/head&gt;
&lt;p class="title"&gt;&lt;b&gt;The Dormouse's story&lt;/b&gt;&lt;/p&gt;</pre>
</div>
<p>HTMLパーサーは、この文字列を読み込み、イベントの連なりとして理解します。&#8221;open an &lt;html&gt; tag&#8221;, &#8220;open a &lt;head&gt; tag&#8221;, &#8220;open a &lt;title&gt; tag&#8221;, &#8220;add a string&#8221;, &#8220;close the &lt;title&gt; tag&#8221;, &#8220;open a &lt;p&gt;&#8221;... といったかんじです。Beautiful Soupはこのイベントの連なりを、さらに再構成して扱います。</p>
<div class="section" id="next-element-previous-element">
<span id="element-generators"></span><h3><tt class="docutils literal"><span class="pre">.next_element</span></tt> / <tt class="docutils literal"><span class="pre">.previous_element</span></tt><a class="headerlink" href="#next-element-previous-element" title="Permalink to this headline">¶</a></h3>
<p>文字列やHTMLタグの <tt class="docutils literal"><span class="pre">.next_element</span></tt> 属性は、それの直後の要素を指し示します。
<tt class="docutils literal"><span class="pre">.next_string</span></tt> と同じようですが、決定的に違います。</p>
<p>&#8220;three sisters&#8221;ドキュメントの最後の&lt;a&gt;タグについて考えてみましょう。
それの <tt class="docutils literal"><span class="pre">.next_string</span></tt> はその&lt;a&gt;タグによって分割された文の後ろの部分の文字列です。(?):</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">last_a_tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&quot;a&quot;</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s">&quot;link3&quot;</span><span class="p">)</span>
<span class="n">last_a_tag</span>
<span class="c"># &lt;a class=&quot;sister&quot; href=&quot;http://example.com/tillie&quot; id=&quot;link3&quot;&gt;Tillie&lt;/a&gt;</span>

<span class="n">last_a_tag</span><span class="o">.</span><span class="n">next_sibling</span>
<span class="c"># &#39;; and they lived at the bottom of a well.&#39;</span>
</pre></div>
</div>
<p>一方、 <tt class="docutils literal"><span class="pre">.next_element</span></tt> は、&lt;a&gt;タグのすぐ後ろの要素である&#8221;Tillie&#8221;という単語を指し示します。文の残りの部分ではありません。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">last_a_tag</span><span class="o">.</span><span class="n">next_element</span>
<span class="c"># u&#39;Tillie&#39;</span>
</pre></div>
</div>
<p>これは元の文章で&#8221;Tillie&#8221;という単語がセミコロンの前に現れるからです。
パーサーは&lt;a&gt;タグに出会い、次に&#8221;Tillie&#8221;という単語、そして&lt;/a&gt;という閉じるタグがきます。
そのあとは、セミコロンがあって、文の残りの部分です。
セミコロンは&lt;a&gt;タグと同じレベルにありますが、&#8221;Tillie&#8221;という単語が最初に出会います。</p>
<p><tt class="docutils literal"><span class="pre">.previous_element</span></tt> 属性は、 <tt class="docutils literal"><span class="pre">.next_element</span></tt> とは逆です。
その要素の一つ前の要素を指し示します。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">last_a_tag</span><span class="o">.</span><span class="n">previous_element</span>
<span class="c"># u&#39; and\n&#39;</span>
<span class="n">last_a_tag</span><span class="o">.</span><span class="n">previous_element</span><span class="o">.</span><span class="n">next_element</span>
<span class="c"># &lt;a class=&quot;sister&quot; href=&quot;http://example.com/tillie&quot; id=&quot;link3&quot;&gt;Tillie&lt;/a&gt;</span>
</pre></div>
</div>
</div>
<div class="section" id="next-elements-previous-elements">
<h3><tt class="docutils literal"><span class="pre">.next_elements</span></tt> / <tt class="docutils literal"><span class="pre">.previous_elements</span></tt><a class="headerlink" href="#next-elements-previous-elements" title="Permalink to this headline">¶</a></h3>
<p>パースされたドキュメントの要素を、前後方向に取得していくイテレーターを使うこともできます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">element</span> <span class="ow">in</span> <span class="n">last_a_tag</span><span class="o">.</span><span class="n">next_elements</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">element</span><span class="p">))</span>
<span class="c"># u&#39;Tillie&#39;</span>
<span class="c"># u&#39;;\nand they lived at the bottom of a well.&#39;</span>
<span class="c"># u&#39;\n\n&#39;</span>
<span class="c"># &lt;p class=&quot;story&quot;&gt;...&lt;/p&gt;</span>
<span class="c"># u&#39;...&#39;</span>
<span class="c"># u&#39;\n&#39;</span>
<span class="c"># None</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="section" id="id25">
<h1>パースツリーを検索<a class="headerlink" href="#id25" title="Permalink to this headline">¶</a></h1>
<p>Beautiful Soupはパースパースツリーを検索する多くのメソッドを定義しています。
しかし、それらはどれもとても似通っています。
この章では、<tt class="docutils literal"><span class="pre">find()</span></tt> と <tt class="docutils literal"><span class="pre">find_all()</span></tt> という2つの人気のメソッドの説明に、多くのスペースを費やします。
それ以外のメソッドは、ほとんど同じ引数を持つので、簡単な説明にとどめることにします。</p>
<p>ここでは再び、&#8221;three sisters&#8221;ドキュメントを例に使っていきます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">html_doc</span> <span class="o">=</span> <span class="s">&quot;&quot;&quot;</span>
<span class="s">&lt;html&gt;&lt;head&gt;&lt;title&gt;The Dormouse&#39;s story&lt;/title&gt;&lt;/head&gt;</span>

<span class="s">&lt;p class=&quot;title&quot;&gt;&lt;b&gt;The Dormouse&#39;s story&lt;/b&gt;&lt;/p&gt;</span>

<span class="s">&lt;p class=&quot;story&quot;&gt;Once upon a time there were three little sisters; and their names were</span>
<span class="s">&lt;a href=&quot;http://example.com/elsie&quot; class=&quot;sister&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;,</span>
<span class="s">&lt;a href=&quot;http://example.com/lacie&quot; class=&quot;sister&quot; id=&quot;link2&quot;&gt;Lacie&lt;/a&gt; and</span>
<span class="s">&lt;a href=&quot;http://example.com/tillie&quot; class=&quot;sister&quot; id=&quot;link3&quot;&gt;Tillie&lt;/a&gt;;</span>
<span class="s">and they lived at the bottom of a well.&lt;/p&gt;</span>

<span class="s">&lt;p class=&quot;story&quot;&gt;...&lt;/p&gt;</span>
<span class="s">&quot;&quot;&quot;</span>

<span class="kn">from</span> <span class="nn">bs4</span> <span class="kn">import</span> <span class="n">BeautifulSoup</span>
<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">html_doc</span><span class="p">)</span>
</pre></div>
</div>
<p><tt class="docutils literal"><span class="pre">find_all()</span></tt> のようなフィルターを通すことにより、
興味のあるドキュメントのある一部分にズームすることができます。</p>
<div class="section" id="id26">
<h2>フィルターの種類<a class="headerlink" href="#id26" title="Permalink to this headline">¶</a></h2>
<p><tt class="docutils literal"><span class="pre">find_all()</span></tt> 等のメソッドの詳細を説明するまえに、これらのメソッドに渡すフィルターの例を示します。
検索APIの使い方をマスターする上で、フィルターは何度もでてきます。
これにより、タグ名, タグの属性, ドキュメントの文字列やそれを組み合わせた条件を指定して、フィルターをかけます</p>
<span class="target" id="a-string"></span><div class="section" id="id27">
<h3>文字列<a class="headerlink" href="#id27" title="Permalink to this headline">¶</a></h3>
<p>もっともシンプルなフィルターは文字列です。
検索メソッドに文字列を渡すと、Beautiful Soupは厳格に文字列を一致させます。
以下のコードは、ドキュメント内の&lt;b&gt;タグを全て見つけます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">&#39;b&#39;</span><span class="p">)</span>
<span class="c"># [&lt;b&gt;The Dormouse&#39;s story&lt;/b&gt;]</span>
</pre></div>
</div>
<p>バイト文字列を渡すと、Beautiful SoupはそれをUTF-8にエンコードされた文字列として扱います。
これを避けるには、代わりにUnicode文字列を渡します。</p>
<span class="target" id="a-regular-expression"></span></div>
<div class="section" id="id28">
<h3>正規表現<a class="headerlink" href="#id28" title="Permalink to this headline">¶</a></h3>
<p>正規表現オブジェクトを渡すと、Beautiful Soupはそれの <tt class="docutils literal"><span class="pre">match()</span></tt> メソッドを用いて、その正規表現に一致するものをマッチさせます。
以下のコードは、全ての&#8221;b&#8221;ではじまるつづりの名前のタグを見つけます。
&#8220;three sisters&#8221;ドキュメントでは、&lt;body&gt;タグと&lt;b&gt;タグにマッチします。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">re</span>
<span class="k">for</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">&quot;^b&quot;</span><span class="p">)):</span>
    <span class="k">print</span><span class="p">(</span><span class="n">tag</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="c"># body</span>
<span class="c"># b</span>
</pre></div>
</div>
<p>以下のコードでは、タグ名に&#8221;t&#8221;のつづりを含むもの全てを見つけます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">&quot;t&quot;</span><span class="p">)):</span>
    <span class="k">print</span><span class="p">(</span><span class="n">tag</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="c"># html</span>
<span class="c"># title</span>
</pre></div>
</div>
<span class="target" id="a-list"></span></div>
<div class="section" id="id29">
<h3>リスト<a class="headerlink" href="#id29" title="Permalink to this headline">¶</a></h3>
<p>フィルターにリストで引数をわたすと、Beautiful Soupはそのリストの内のいずれかにマッチした要素を返します。
以下のコードは、全ての&lt;a&gt;タグと&lt;b&gt;タグを見つけます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">([</span><span class="s">&quot;a&quot;</span><span class="p">,</span> <span class="s">&quot;b&quot;</span><span class="p">])</span>
<span class="c"># [&lt;b&gt;The Dormouse&#39;s story&lt;/b&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot; id=&quot;link2&quot;&gt;Lacie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/tillie&quot; id=&quot;link3&quot;&gt;Tillie&lt;/a&gt;]</span>
</pre></div>
</div>
</div>
<div class="section" id="true">
<span id="the-value-true"></span><h3>True値<a class="headerlink" href="#true" title="Permalink to this headline">¶</a></h3>
<p><tt class="docutils literal"><span class="pre">True値</span></tt> は全ての要素にマッチします。
以下のコードは、ドキュメント内の <strong>全て</strong> のタグをみつけます。
ただし、ドキュメント本文のテキスト文字列はマッチされません。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="bp">True</span><span class="p">):</span>
    <span class="k">print</span><span class="p">(</span><span class="n">tag</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="c"># html</span>
<span class="c"># head</span>
<span class="c"># title</span>
<span class="c"># body</span>
<span class="c"># p</span>
<span class="c"># b</span>
<span class="c"># p</span>
<span class="c"># a</span>
<span class="c"># a</span>
<span class="c"># a</span>
<span class="c"># p</span>
</pre></div>
</div>
</div>
<div class="section" id="id30">
<h3>関数<a class="headerlink" href="#id30" title="Permalink to this headline">¶</a></h3>
<p>以上のフィルターで機能が足りないときは、自分で引数に要素をとる関数を定義することもできます。
その関数は、引数がマッチしたときは <tt class="docutils literal"><span class="pre">True</span></tt> を、そうでないときは <tt class="docutils literal"><span class="pre">False</span></tt> を返します。</p>
<p>以下の関数では、HTMLタグが &#8220;class&#8221; 属性を持ち、&#8221;id&#8221;属性を持たない場合に <tt class="docutils literal"><span class="pre">True</span></tt> を返します。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">has_class_but_no_id</span><span class="p">(</span><span class="n">tag</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">tag</span><span class="o">.</span><span class="n">has_attr</span><span class="p">(</span><span class="s">&#39;class&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">tag</span><span class="o">.</span><span class="n">has_attr</span><span class="p">(</span><span class="s">&#39;id&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p>この関数を <tt class="docutils literal"><span class="pre">find_all()</span></tt> に渡すと、&#8221;three sisters&#8221;ドキュメントから全ての&lt;p&gt;タグを取得できます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">has_class_but_no_id</span><span class="p">)</span>
<span class="c"># [&lt;p class=&quot;title&quot;&gt;&lt;b&gt;The Dormouse&#39;s story&lt;/b&gt;&lt;/p&gt;,</span>
<span class="c">#  &lt;p class=&quot;story&quot;&gt;Once upon a time there were...&lt;/p&gt;,</span>
<span class="c">#  &lt;p class=&quot;story&quot;&gt;...&lt;/p&gt;]</span>
</pre></div>
</div>
<p>この関数は&lt;p&gt;タグだけを抽出します。
&lt;a&gt;タグは&#8221;class&#8221;と&#8221;id&#8221;の両方の属性を定義しているので抽出できません。
&lt;html&gt;や&lt;title&gt;のようなタグは、&#8221;class&#8221;を定義してないので、同様に抽出できません。</p>
<p>以下の関数は、HTMLタグがstringオブジェクトに囲まれているときは、 <tt class="docutils literal"><span class="pre">True</span></tt> を返します。(?):</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">bs4</span> <span class="kn">import</span> <span class="n">NavigableString</span>
<span class="k">def</span> <span class="nf">surrounded_by_strings</span><span class="p">(</span><span class="n">tag</span><span class="p">):</span>
    <span class="k">return</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">tag</span><span class="o">.</span><span class="n">next_element</span><span class="p">,</span> <span class="n">NavigableString</span><span class="p">)</span>
            <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">tag</span><span class="o">.</span><span class="n">previous_element</span><span class="p">,</span> <span class="n">NavigableString</span><span class="p">))</span>

<span class="k">for</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">surrounded_by_strings</span><span class="p">):</span>
    <span class="k">print</span> <span class="n">tag</span><span class="o">.</span><span class="n">name</span>
<span class="c"># p</span>
<span class="c"># a</span>
<span class="c"># a</span>
<span class="c"># a</span>
<span class="c"># p</span>
</pre></div>
</div>
<p>これで検索メソッドの詳細をみていくことの準備ができました。</p>
</div>
</div>
<div class="section" id="find-all">
<h2><tt class="docutils literal"><span class="pre">find_all()</span></tt><a class="headerlink" href="#find-all" title="Permalink to this headline">¶</a></h2>
<p>使い方: find_all(<a class="reference internal" href="#name"><em>name</em></a>, <a class="reference internal" href="#attrs"><em>attrs</em></a>, <a class="reference internal" href="#recursive"><em>recursive</em></a>, <a class="reference internal" href="#text"><em>text</em></a>, <a class="reference internal" href="#limit"><em>limit</em></a>, <a class="reference internal" href="#kwargs"><em>**kwargs</em></a>)</p>
<p><tt class="docutils literal"><span class="pre">find_all()</span></tt> メソッドは、<cite>Tag</cite> オブジェクトが持つ子孫要素のうち、引数に一致する <strong>全ての</strong> 要素を見つけます。
<a class="reference internal" href="#id26">フィルターの種類</a> でいくつかの例を挙げましたが、ここでもう少し説明します。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">&quot;title&quot;</span><span class="p">)</span>
<span class="c"># [&lt;title&gt;The Dormouse&#39;s story&lt;/title&gt;]</span>

<span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">&quot;p&quot;</span><span class="p">,</span> <span class="s">&quot;title&quot;</span><span class="p">)</span>
<span class="c"># [&lt;p class=&quot;title&quot;&gt;&lt;b&gt;The Dormouse&#39;s story&lt;/b&gt;&lt;/p&gt;]</span>

<span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">&quot;a&quot;</span><span class="p">)</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot; id=&quot;link2&quot;&gt;Lacie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/tillie&quot; id=&quot;link3&quot;&gt;Tillie&lt;/a&gt;]</span>

<span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="s">&quot;link2&quot;</span><span class="p">)</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot; id=&quot;link2&quot;&gt;Lacie&lt;/a&gt;]</span>

<span class="kn">import</span> <span class="nn">re</span>
<span class="n">soup</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">&quot;sisters&quot;</span><span class="p">))</span>
<span class="c"># u&#39;Once upon a time there were three little sisters; and their names were\n&#39;</span>
</pre></div>
</div>
<p>これらの使い方は、すでに説明してるものもあれば、初出のものもあります。
<tt class="docutils literal"><span class="pre">text</span></tt> や <tt class="docutils literal"><span class="pre">id</span></tt> に値を渡すのはどういう意味でしょうか?
なぜ、<tt class="docutils literal"><span class="pre">find_all(&quot;p&quot;,</span> <span class="pre">&quot;title&quot;)</span></tt> は、CSSの&#8221;title&#8221;タグをもつ&lt;p&gt;タグを発見したのでしょうか?
<tt class="docutils literal"><span class="pre">find_all()</span></tt> の引数をみていきましょう。</p>
<span class="target" id="name"></span><div class="section" id="id31">
<h3>name引数<a class="headerlink" href="#id31" title="Permalink to this headline">¶</a></h3>
<p><tt class="docutils literal"><span class="pre">find_all()</span></tt> の <tt class="docutils literal"><span class="pre">name</span></tt> 引数に値を渡すと、タグの名前だけを対象に検索が行われます。
名前がマッチしないタグと同じように、テキスト文字列は無視されます。</p>
<p>以下の例は、もっともシンプルな使い方です。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">&quot;title&quot;</span><span class="p">)</span>
<span class="c"># [&lt;title&gt;The Dormouse&#39;s story&lt;/title&gt;]</span>
</pre></div>
</div>
<p><a class="reference internal" href="#id26">フィルターの種類</a> で述べたように、 <tt class="docutils literal"><span class="pre">name</span></tt> 引数は文字列, 正規表現, リスト, 関数, True値をとることができます。</p>
<span class="target" id="kwargs"></span></div>
<div class="section" id="id32">
<h3>キーワード引数<a class="headerlink" href="#id32" title="Permalink to this headline">¶</a></h3>
<p>どのような理解できない引数でも、タグの属性の一つとして解釈されます。
キーワード引数 <tt class="docutils literal"><span class="pre">id</span></tt> に値を渡すと、Beautiful Soupはタグの&#8217;id&#8217;属性に対してフィルタリングを行います。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="s">&#39;link2&#39;</span><span class="p">)</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot; id=&quot;link2&quot;&gt;Lacie&lt;/a&gt;]</span>
</pre></div>
</div>
<p>キーワード引数 <tt class="docutils literal"><span class="pre">href</span></tt> に値を渡すと、Beautiful SoupはHTMLタグの&#8217;href&#8217;属性に対してフィルタリングを行います。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">href</span><span class="o">=</span><span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">&quot;elsie&quot;</span><span class="p">))</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;]</span>
</pre></div>
</div>
<p>キーワード引数の値もまた、 <a class="reference internal" href="#id27">文字列</a>, <a class="reference internal" href="#id28">正規表現</a>, <a class="reference internal" href="#id29">リスト</a>, <a class="reference internal" href="#id30">関数</a>, <a class="reference internal" href="#true">True値</a> をとることができます。</p>
<p>次のコードは、<tt class="docutils literal"><span class="pre">id</span></tt> 属性に値が入っている全てのタグを見つけます。このとき、値は何でもあっても構いません。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot; id=&quot;link2&quot;&gt;Lacie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/tillie&quot; id=&quot;link3&quot;&gt;Tillie&lt;/a&gt;]</span>
</pre></div>
</div>
<p>複数のキーワード引数を一度に渡すことによって、複数の属性についてフィルタリングできます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">href</span><span class="o">=</span><span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">&quot;elsie&quot;</span><span class="p">),</span> <span class="nb">id</span><span class="o">=</span><span class="s">&#39;link1&#39;</span><span class="p">)</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;three&lt;/a&gt;]</span>
</pre></div>
</div>
<p>HTML5の &#8216;data-*&#8217; 属性など、いくつかの属性についてはキーワード引数として用いることができません。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">data_soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">&#39;&lt;div data-foo=&quot;value&quot;&gt;foo!&lt;/div&gt;&#39;</span><span class="p">)</span>
<span class="n">data_soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">data</span><span class="o">-</span><span class="n">foo</span><span class="o">=</span><span class="s">&quot;value&quot;</span><span class="p">)</span>
<span class="c"># SyntaxError: keyword can&#39;t be an expression</span>
</pre></div>
</div>
<p>しかし、これらの属性を辞書にして、キーワード引数 <tt class="docutils literal"><span class="pre">attrs</span></tt> として値を渡せばフィルタリングすることができます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">data_soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">attrs</span><span class="o">=</span><span class="p">{</span><span class="s">&quot;data-foo&quot;</span><span class="p">:</span> <span class="s">&quot;value&quot;</span><span class="p">})</span>
<span class="c"># [&lt;div data-foo=&quot;value&quot;&gt;foo!&lt;/div&gt;]</span>
</pre></div>
</div>
<span class="target" id="attrs"></span></div>
<div class="section" id="css">
<h3>CSSのクラスで検索<a class="headerlink" href="#css" title="Permalink to this headline">¶</a></h3>
<p>HTMLタグが持つCSSのクラスで検索をかけるのはとても便利です。
しかし&#8221;class&#8221;はPythonの予約語のため、<tt class="docutils literal"><span class="pre">class</span></tt> をキーワード引数として用いると文法エラーになります。
そこで、Beautiful Soup 4.1.2からは、 <tt class="docutils literal"><span class="pre">class_</span></tt> というキーワード引数でCSSのクラスを検索できるようになりました。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">&quot;a&quot;</span><span class="p">,</span> <span class="n">class_</span><span class="o">=</span><span class="s">&quot;sister&quot;</span><span class="p">)</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot; id=&quot;link2&quot;&gt;Lacie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/tillie&quot; id=&quot;link3&quot;&gt;Tillie&lt;/a&gt;]</span>
</pre></div>
</div>
<p>他のキーワード引数と同様、 <tt class="docutils literal"><span class="pre">class_</span></tt> には文字列, 正規表現, 関数, True値を渡せます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">class_</span><span class="o">=</span><span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">&quot;itl&quot;</span><span class="p">))</span>
<span class="c"># [&lt;p class=&quot;title&quot;&gt;&lt;b&gt;The Dormouse&#39;s story&lt;/b&gt;&lt;/p&gt;]</span>

<span class="k">def</span> <span class="nf">has_six_characters</span><span class="p">(</span><span class="n">css_class</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">css_class</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">css_class</span><span class="p">)</span> <span class="o">==</span> <span class="mi">6</span>

<span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">class_</span><span class="o">=</span><span class="n">has_six_characters</span><span class="p">)</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot; id=&quot;link2&quot;&gt;Lacie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/tillie&quot; id=&quot;link3&quot;&gt;Tillie&lt;/a&gt;]</span>
</pre></div>
</div>
<p><cite>Tag</cite> オブジェクトの属性の <a class="reference internal" href="#id15">値が複数のとき</a> を思い出してください。
それと同様に、あるCSSクラスを検索するときは、複数のCSSクラスに対してマッチさせられます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">css_soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">&#39;&lt;p class=&quot;body strikeout&quot;&gt;&lt;/p&gt;&#39;</span><span class="p">)</span>
<span class="n">css_soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">&quot;p&quot;</span><span class="p">,</span> <span class="n">class_</span><span class="o">=</span><span class="s">&quot;strikeout&quot;</span><span class="p">)</span>
<span class="c"># [&lt;p class=&quot;body strikeout&quot;&gt;&lt;/p&gt;]</span>

<span class="n">css_soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">&quot;p&quot;</span><span class="p">,</span> <span class="n">class_</span><span class="o">=</span><span class="s">&quot;body&quot;</span><span class="p">)</span>
<span class="c"># [&lt;p class=&quot;body strikeout&quot;&gt;&lt;/p&gt;]</span>
</pre></div>
</div>
<p><tt class="docutils literal"><span class="pre">class</span></tt> 属性の値は、文字列としても検索できます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">css_soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">&quot;p&quot;</span><span class="p">,</span> <span class="n">class_</span><span class="o">=</span><span class="s">&quot;body strikeout&quot;</span><span class="p">)</span>
<span class="c"># [&lt;p class=&quot;body strikeout&quot;&gt;&lt;/p&gt;]</span>
</pre></div>
</div>
<p>しかし、文字列の値としての変数を検索することはできません。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">css_soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">&quot;p&quot;</span><span class="p">,</span> <span class="n">class_</span><span class="o">=</span><span class="s">&quot;strikeout body&quot;</span><span class="p">)</span>
<span class="c"># []</span>
</pre></div>
</div>
<p>もしあなたが2つ以上のクラスをまっちさせたいなら、CSSセレクトを使ってください。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">css_soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">&quot;p.strikeout.body&quot;</span><span class="p">)</span>
<span class="c"># [&lt;p class=&quot;body strikeout&quot;&gt;&lt;/p&gt;]</span>
</pre></div>
</div>
<p>Beautiful Soupの古いバージョンでは、 <tt class="docutils literal"><span class="pre">class_</span></tt> 引数は使えません。
そこで、以下に述べる <tt class="docutils literal"><span class="pre">attrs</span></tt> トリックを使うことができます。
これは&#8221;class&#8221;をkeyに持つ辞書を <tt class="docutils literal"><span class="pre">attrs</span></tt> 引数に渡して、検索することができます。
この辞書のvalueには、文字列, 正規表現などが使えます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">&quot;a&quot;</span><span class="p">,</span> <span class="n">attrs</span><span class="o">=</span><span class="p">{</span><span class="s">&quot;class&quot;</span><span class="p">:</span> <span class="s">&quot;sister&quot;</span><span class="p">})</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot; id=&quot;link2&quot;&gt;Lacie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/tillie&quot; id=&quot;link3&quot;&gt;Tillie&lt;/a&gt;]</span>
</pre></div>
</div>
<span class="target" id="text"></span></div>
<div class="section" id="id33">
<h3>text引数<a class="headerlink" href="#id33" title="Permalink to this headline">¶</a></h3>
<p><tt class="docutils literal"><span class="pre">text</span></tt> 引数で、タグに挟まれている文字列を対象に検索することができます。
<tt class="docutils literal"><span class="pre">name</span></tt> 引数やキーワード引数のように、 <a class="reference internal" href="#id27">文字列</a> , <a class="reference internal" href="#id28">正規表現</a> , <a class="reference internal" href="#id29">リスト</a> , <a class="reference internal" href="#id30">関数</a> , <a class="reference internal" href="#true">True値</a> が使えます。
以下の例をごらんください。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="s">&quot;Elsie&quot;</span><span class="p">)</span>
<span class="c"># [u&#39;Elsie&#39;]</span>

<span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="p">[</span><span class="s">&quot;Tillie&quot;</span><span class="p">,</span> <span class="s">&quot;Elsie&quot;</span><span class="p">,</span> <span class="s">&quot;Lacie&quot;</span><span class="p">])</span>
<span class="c"># [u&#39;Elsie&#39;, u&#39;Lacie&#39;, u&#39;Tillie&#39;]</span>

<span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">&quot;Dormouse&quot;</span><span class="p">))</span>
<span class="p">[</span><span class="s">u&quot;The Dormouse&#39;s story&quot;</span><span class="p">,</span> <span class="s">u&quot;The Dormouse&#39;s story&quot;</span><span class="p">]</span>

<span class="k">def</span> <span class="nf">is_the_only_string_within_a_tag</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;Return True if this string is the only child of its parent tag.&quot;&quot;&quot;</span>
    <span class="k">return</span> <span class="p">(</span><span class="n">s</span> <span class="o">==</span> <span class="n">s</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">string</span><span class="p">)</span>

<span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="n">is_the_only_string_within_a_tag</span><span class="p">)</span>
<span class="c"># [u&quot;The Dormouse&#39;s story&quot;, u&quot;The Dormouse&#39;s story&quot;, u&#39;Elsie&#39;, u&#39;Lacie&#39;, u&#39;Tillie&#39;, u&#39;...&#39;]</span>
</pre></div>
</div>
<p><tt class="docutils literal"><span class="pre">text</span></tt> 引数はテキスト文字列の検索ですが、これにタグの検索を組みわせることもできます。
Beautiful Soupは、<tt class="docutils literal"><span class="pre">text</span></tt> 引数で指定した文字列を <tt class="docutils literal"><span class="pre">.string</span></tt> にもつタグ全てを見つけます。
次のコードは、<tt class="docutils literal"><span class="pre">.string</span></tt> に &#8220;Elsie&#8221;を持つ&lt;a&gt;タグを見つけます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">&quot;a&quot;</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="s">&quot;Elsie&quot;</span><span class="p">)</span>
<span class="c"># [&lt;a href=&quot;http://example.com/elsie&quot; class=&quot;sister&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;]</span>
</pre></div>
</div>
</div>
<div class="section" id="limit">
<span id="id34"></span><h3>limit引数<a class="headerlink" href="#limit" title="Permalink to this headline">¶</a></h3>
<p><tt class="docutils literal"><span class="pre">find_all()</span></tt> メソッドは、指定したフィルターにマッチした全てのタグと文字列を返します。
これはドキュメントが大きいときは時間がかかります。
もし、 <strong>全ての</strong> 結果を必要としなければ、<tt class="docutils literal"><span class="pre">limit</span></tt> 引数で取得する数を指定することができます。</p>
<p>&#8220;three siters&#8221;ドキュメントには3つのリンクがある、しかし以下のコードははじめの2つしか見つけない。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">&quot;a&quot;</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot; id=&quot;link2&quot;&gt;Lacie&lt;/a&gt;]</span>
</pre></div>
</div>
</div>
<div class="section" id="recursive">
<span id="id35"></span><h3>recursive引数<a class="headerlink" href="#recursive" title="Permalink to this headline">¶</a></h3>
<p><tt class="docutils literal"><span class="pre">mytag.find_all()</span></tt> を実行すると、Beautiful Soupは、 <tt class="docutils literal"><span class="pre">mytag</span></tt> の全ての子孫要素を調べます。
(子要素、子要素の子要素、そのまた子要素というかんじで、、)
もし、直下の子要素しか調べたくなければ、<tt class="docutils literal"><span class="pre">recursive=False</span></tt> という引数を渡せばよいです。
以下で違いをみてみましょう。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">html</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">&quot;title&quot;</span><span class="p">)</span>
<span class="c"># [&lt;title&gt;The Dormouse&#39;s story&lt;/title&gt;]</span>

<span class="n">soup</span><span class="o">.</span><span class="n">html</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">&quot;title&quot;</span><span class="p">,</span> <span class="n">recursive</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="c"># []</span>
</pre></div>
</div>
<p>これはドキュメントの一部です。:</p>
<div class="highlight-python"><pre>&lt;html&gt;
 &lt;head&gt;
  &lt;title&gt;
   The Dormouse's story
  &lt;/title&gt;
 &lt;/head&gt;
...</pre>
</div>
<p>このドキュメントにおいて、&lt;title&gt;タグは&lt;html&gt;の下にはあるが、<cite>直下</cite> にあるわけではありません。
Beautiful Soupが&lt;title&gt;タグを見つけることができるのは、&lt;html&gt;タグ以下の全ての子孫要素を探してよいときだけです。
もし、<tt class="docutils literal"><span class="pre">find_all()</span></tt> の引数に <tt class="docutils literal"><span class="pre">recurive=False</span></tt> という&lt;html&gt;タグの直下のみを検索するという制限がかかっていたら、&lt;title&gt;タグを見つけることはできません。</p>
<p>Beautiful Soupは、多くのパースツリーを検索するメソッドを提供しています。
それら多くは共通する引数を持ちます。
<tt class="docutils literal"><span class="pre">find_all()</span></tt> の <tt class="docutils literal"><span class="pre">name</span></tt>, <tt class="docutils literal"><span class="pre">attrs</span></tt>, <tt class="docutils literal"><span class="pre">text</span></tt>, <tt class="docutils literal"><span class="pre">limit</span></tt>, キーワード引数は、他の多くのメソッドにも対応しています。
しかし、 <tt class="docutils literal"><span class="pre">recursive</span></tt> 引数は、 <tt class="docutils literal"><span class="pre">find_all()</span></tt>, <tt class="docutils literal"><span class="pre">find()</span></tt> の2つのメソッドしか対応していません。
<tt class="docutils literal"><span class="pre">find_parents()</span></tt> のようなメソッドに、引数 <tt class="docutils literal"><span class="pre">recursive=False</span></tt> を渡しても意味がありません。</p>
</div>
<div class="section" id="id36">
<h3>ショートカット<a class="headerlink" href="#id36" title="Permalink to this headline">¶</a></h3>
<p><tt class="docutils literal"><span class="pre">find_all()</span></tt> はBeautiful Soupの検索APIの中で、一番使われるものなので、ショートカットがあります。
<tt class="docutils literal"><span class="pre">Beautiful</span> <span class="pre">Soup</span></tt> オブジェクトや <tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトを関数のように扱って、 <tt class="docutils literal"><span class="pre">find_all()</span></tt> メソッドを呼び出すことができます。
以下の2行は等価です。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">&quot;a&quot;</span><span class="p">)</span>
<span class="n">soup</span><span class="p">(</span><span class="s">&quot;a&quot;</span><span class="p">)</span>
</pre></div>
</div>
<p>以下の2行もまた等価です。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">title</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">soup</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="find">
<h2><tt class="docutils literal"><span class="pre">find()</span></tt><a class="headerlink" href="#find" title="Permalink to this headline">¶</a></h2>
<p>使い方: find(<a class="reference internal" href="#name"><em>name</em></a>, <a class="reference internal" href="#attrs"><em>attrs</em></a>, <a class="reference internal" href="#recursive"><em>recursive</em></a>, <a class="reference internal" href="#text"><em>text</em></a>, <a class="reference internal" href="#kwargs"><em>**kwargs</em></a>)</p>
<p><tt class="docutils literal"><span class="pre">find_all()</span></tt> メソッドは、検索結果を得るためにHTMLドキュメント全部をスキャンします。
しかし、1つだけの検索結果が必要なときがあります。
もし、HTMLドキュメントに&lt;body&gt;タグが1つだけなら、HTMLドキュメント全体をスキャンするのは時間の無駄です。
その場合は <tt class="docutils literal"><span class="pre">find_all()</span></tt> メソッドに <tt class="docutils literal"><span class="pre">limit=1</span></tt> という引数を渡さずに、 <tt class="docutils literal"><span class="pre">find()</span></tt> メソッドを使うことができます。
以下の2行は、ほぼ等価です。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">&#39;title&#39;</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="c"># [&lt;title&gt;The Dormouse&#39;s story&lt;/title&gt;]</span>

<span class="n">soup</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&#39;title&#39;</span><span class="p">)</span>
<span class="c"># &lt;title&gt;The Dormouse&#39;s story&lt;/title&gt;</span>
</pre></div>
</div>
<p>ただ1つ違う点は、<tt class="docutils literal"><span class="pre">find_all()</span></tt> は要素1のリストを返し、<tt class="docutils literal"><span class="pre">find()</span></tt> は要素をそのまま返すことです。</p>
<p><tt class="docutils literal"><span class="pre">find_all()</span></tt> が何もみつけられないときは空リストを返します。
<tt class="docutils literal"><span class="pre">find()</span></tt> が何もみつけられないときは、 <tt class="docutils literal"><span class="pre">None</span></tt> を返します。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&quot;nosuchtag&quot;</span><span class="p">))</span>
<span class="c"># None</span>
</pre></div>
</div>
<p><a class="reference internal" href="#id18">タグ名で探索</a> で出てきた <tt class="docutils literal"><span class="pre">soup.head.title</span></tt> で探索する方法を覚えていますか? おkれは、<tt class="docutils literal"><span class="pre">find()</span></tt> についても適用できます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">head</span><span class="o">.</span><span class="n">title</span>
<span class="c"># &lt;title&gt;The Dormouse&#39;s story&lt;/title&gt;</span>

<span class="n">soup</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&quot;head&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&quot;title&quot;</span><span class="p">)</span>
<span class="c"># &lt;title&gt;The Dormouse&#39;s story&lt;/title&gt;</span>
</pre></div>
</div>
</div>
<div class="section" id="find-parents-find-parent">
<h2><tt class="docutils literal"><span class="pre">find_parents()</span></tt> / <tt class="docutils literal"><span class="pre">find_parent()</span></tt><a class="headerlink" href="#find-parents-find-parent" title="Permalink to this headline">¶</a></h2>
<p>使い方: find_parents(<a class="reference internal" href="#name"><em>name</em></a>, <a class="reference internal" href="#attrs"><em>attrs</em></a>, <a class="reference internal" href="#text"><em>text</em></a>, <a class="reference internal" href="#limit"><em>limit</em></a>, <a class="reference internal" href="#kwargs"><em>**kwargs</em></a>)</p>
<p>使い方: find_parent(<a class="reference internal" href="#name"><em>name</em></a>, <a class="reference internal" href="#attrs"><em>attrs</em></a>, <a class="reference internal" href="#text"><em>text</em></a>, <a class="reference internal" href="#kwargs"><em>**kwargs</em></a>)</p>
<p>ここまで <tt class="docutils literal"><span class="pre">find_all()</span></tt> と <tt class="docutils literal"><span class="pre">find()</span></tt> について述べてきました。
Beautiful Soup APIにはパースツリーを検索するためのメソッドが、あと10あります。
しかし、おそれる必要はありません。
そのうち5つは、<tt class="docutils literal"><span class="pre">find_all()</span></tt> と基本的に同じです。
そして、のこりの5つは <tt class="docutils literal"><span class="pre">find()</span></tt> と基本的に同じです。
違いは、ツリーのどの部分を検索対象にするのかという点のみです。</p>
<p>最初に、 <tt class="docutils literal"><span class="pre">find_parents()</span></tt> と <tt class="docutils literal"><span class="pre">find_parent()</span></tt> を見てみましょう。
<tt class="docutils literal"><span class="pre">find_all()</span></tt> と <tt class="docutils literal"><span class="pre">find()</span></tt> がタグの子孫を見て、ツリーを下りていったことを思い出してください。
<tt class="docutils literal"><span class="pre">find_parents()</span></tt> と <tt class="docutils literal"><span class="pre">find_parent()</span></tt> は逆です。
これらはタグや文字列の親をみて、ツリーを&#8217;上に&#8217;検索していきます。
以下の&#8221;three daughters&#8221;ドキュメントの例で、深いレベルにある文字列から検索していく様子を見てください。:</p>
<div class="highlight-python"><pre>a_string = soup.find(text="Lacie")
a_string
# u'Lacie'

a_string.find_parents("a")
# [&lt;a class="sister" href="http://example.com/lacie" id="link2"&gt;Lacie&lt;/a&gt;]

a_string.find_parent("p")
# &lt;p class="story"&gt;Once upon a time there were three little sisters; and their names were
#  &lt;a class="sister" href="http://example.com/elsie" id="link1"&gt;Elsie&lt;/a&gt;,
#  &lt;a class="sister" href="http://example.com/lacie" id="link2"&gt;Lacie&lt;/a&gt; and
#  &lt;a class="sister" href="http://example.com/tillie" id="link3"&gt;Tillie&lt;/a&gt;;
#  and they lived at the bottom of a well.&lt;/p&gt;

a_string.find_parents("p", class_="title")
# []</pre>
</div>
<p>3つの&lt;a&gt;タグのうちの1つは、検索の起点になる文字列の直接の親要素なので、それが返されました。
3つの&lt;p&gt;タグのうちの1つは、起点の文字列の直接の親ではありませんが、やはりそれも返されました。
CSSクラス&#8221;title&#8221;をもつ&lt;p&gt;タグは、&#8221;three daughers&#8221;ドキュメント中にはあるのですが、起点の文字列の親要素ではないので、 <tt class="docutils literal"><span class="pre">find_parents()</span></tt> では見つけることができませんでした。</p>
<p><tt class="docutils literal"><span class="pre">find_parent()</span></tt> と <tt class="docutils literal"><span class="pre">find_parents()</span></tt> のつながりはわかったでしょうか。
<a class="reference internal" href="#parent">.parent</a> と <a class="reference internal" href="#parents">.parents</a> 属性については、以前に述べてあります。
そのつながりはとても強いです。
これらの検索メソッドは実際には <tt class="docutils literal"><span class="pre">.parents</span></tt> で、全ての親要素の連なりをイテレートして扱います。
そして、要素それぞれについてフィルターにマッチするかどうかをチェックします。</p>
</div>
<div class="section" id="find-next-siblings-find-next-sibling">
<h2><tt class="docutils literal"><span class="pre">find_next_siblings()</span></tt> / <tt class="docutils literal"><span class="pre">find_next_sibling()</span></tt><a class="headerlink" href="#find-next-siblings-find-next-sibling" title="Permalink to this headline">¶</a></h2>
<p>使い方: find_next_siblings(<a class="reference internal" href="#name"><em>name</em></a>, <a class="reference internal" href="#attrs"><em>attrs</em></a>, <a class="reference internal" href="#text"><em>text</em></a>, <a class="reference internal" href="#limit"><em>limit</em></a>, <a class="reference internal" href="#kwargs"><em>**kwargs</em></a>)</p>
<p>使い方: find_next_sibling(<a class="reference internal" href="#name"><em>name</em></a>, <a class="reference internal" href="#attrs"><em>attrs</em></a>, <a class="reference internal" href="#text"><em>text</em></a>, <a class="reference internal" href="#kwargs"><em>**kwargs</em></a>)</p>
<p>これらのメソッドは、後方にある兄弟要素を扱うのに、 <a class="reference internal" href="#sibling-generators"><em>.next_siblings</em></a> を使います。
<tt class="docutils literal"><span class="pre">find_next_siblings()</span></tt> メソッドはマッチする兄弟要素を全て返し、 <tt class="docutils literal"><span class="pre">find_next_sibling()</span></tt> は最初の一つを返します。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">first_link</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">a</span>
<span class="n">first_link</span>
<span class="c"># &lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;</span>

<span class="n">first_link</span><span class="o">.</span><span class="n">find_next_siblings</span><span class="p">(</span><span class="s">&quot;a&quot;</span><span class="p">)</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot; id=&quot;link2&quot;&gt;Lacie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/tillie&quot; id=&quot;link3&quot;&gt;Tillie&lt;/a&gt;]</span>

<span class="n">first_story_paragraph</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&quot;p&quot;</span><span class="p">,</span> <span class="s">&quot;story&quot;</span><span class="p">)</span>
<span class="n">first_story_paragraph</span><span class="o">.</span><span class="n">find_next_sibling</span><span class="p">(</span><span class="s">&quot;p&quot;</span><span class="p">)</span>
<span class="c"># &lt;p class=&quot;story&quot;&gt;...&lt;/p&gt;</span>
</pre></div>
</div>
</div>
<div class="section" id="find-previous-siblings-find-previous-sibling">
<h2><tt class="docutils literal"><span class="pre">find_previous_siblings()</span></tt> / <tt class="docutils literal"><span class="pre">find_previous_sibling()</span></tt><a class="headerlink" href="#find-previous-siblings-find-previous-sibling" title="Permalink to this headline">¶</a></h2>
<p>使い方: find_previous_siblings(<a class="reference internal" href="#name"><em>name</em></a>, <a class="reference internal" href="#attrs"><em>attrs</em></a>, <a class="reference internal" href="#text"><em>text</em></a>, <a class="reference internal" href="#limit"><em>limit</em></a>, <a class="reference internal" href="#kwargs"><em>**kwargs</em></a>)</p>
<p>使い方: find_previous_sibling(<a class="reference internal" href="#name"><em>name</em></a>, <a class="reference internal" href="#attrs"><em>attrs</em></a>, <a class="reference internal" href="#text"><em>text</em></a>, <a class="reference internal" href="#kwargs"><em>**kwargs</em></a>)</p>
<p>これらのメソッドは、HTMLドキュメントの前方にあった兄弟要素を扱うのに <a class="reference internal" href="#sibling-generators"><em>.previous_siblings</em></a> を使います。
<tt class="docutils literal"><span class="pre">find_previous_siblings()</span></tt> メソッドはマッチする兄弟要素を全て返し、 <tt class="docutils literal"><span class="pre">find_previous_sibling()</span></tt> は最初の一つを返します。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">last_link</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&quot;a&quot;</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s">&quot;link3&quot;</span><span class="p">)</span>
<span class="n">last_link</span>
<span class="c"># &lt;a class=&quot;sister&quot; href=&quot;http://example.com/tillie&quot; id=&quot;link3&quot;&gt;Tillie&lt;/a&gt;</span>

<span class="n">last_link</span><span class="o">.</span><span class="n">find_previous_siblings</span><span class="p">(</span><span class="s">&quot;a&quot;</span><span class="p">)</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot; id=&quot;link2&quot;&gt;Lacie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;]</span>

<span class="n">first_story_paragraph</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&quot;p&quot;</span><span class="p">,</span> <span class="s">&quot;story&quot;</span><span class="p">)</span>
<span class="n">first_story_paragraph</span><span class="o">.</span><span class="n">find_previous_sibling</span><span class="p">(</span><span class="s">&quot;p&quot;</span><span class="p">)</span>
<span class="c"># &lt;p class=&quot;title&quot;&gt;&lt;b&gt;The Dormouse&#39;s story&lt;/b&gt;&lt;/p&gt;</span>
</pre></div>
</div>
</div>
<div class="section" id="find-all-next-find-next">
<h2><tt class="docutils literal"><span class="pre">find_all_next()</span></tt> / <tt class="docutils literal"><span class="pre">find_next()</span></tt><a class="headerlink" href="#find-all-next-find-next" title="Permalink to this headline">¶</a></h2>
<p>使い方: find_all_next(<a class="reference internal" href="#name"><em>name</em></a>, <a class="reference internal" href="#attrs"><em>attrs</em></a>, <a class="reference internal" href="#text"><em>text</em></a>, <a class="reference internal" href="#limit"><em>limit</em></a>, <a class="reference internal" href="#kwargs"><em>**kwargs</em></a>)</p>
<p>使い方: find_next(<a class="reference internal" href="#name"><em>name</em></a>, <a class="reference internal" href="#attrs"><em>attrs</em></a>, <a class="reference internal" href="#text"><em>text</em></a>, <a class="reference internal" href="#kwargs"><em>**kwargs</em></a>)</p>
<p>これらのメソッドは、HTMLドキュメントのその後にあらわれるタグと文字列の要素全てイテレートして扱うために、 <tt class="docutils literal"><span class="pre">.next_elements</span></tt> メソッドを使います。
<tt class="docutils literal"><span class="pre">find_all_next()</span></tt> メソッドはマッチするもの全てを返し、 <tt class="docutils literal"><span class="pre">find_next()</span></tt> は最初にマッチしたものを返します。(!要改善):</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">first_link</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">a</span>
<span class="n">first_link</span>
<span class="c"># &lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;</span>

<span class="n">first_link</span><span class="o">.</span><span class="n">find_all_next</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="c"># [u&#39;Elsie&#39;, u&#39;,\n&#39;, u&#39;Lacie&#39;, u&#39; and\n&#39;, u&#39;Tillie&#39;,</span>
<span class="c">#  u&#39;;\nand they lived at the bottom of a well.&#39;, u&#39;\n\n&#39;, u&#39;...&#39;, u&#39;\n&#39;]</span>

<span class="n">first_link</span><span class="o">.</span><span class="n">find_next</span><span class="p">(</span><span class="s">&quot;p&quot;</span><span class="p">)</span>
<span class="c"># &lt;p class=&quot;story&quot;&gt;...&lt;/p&gt;</span>
</pre></div>
</div>
<p>最初の例では、起点となった&lt;a&gt;タグに挟まれている、文字列&#8221;Elsie&#8221;が返されています。
2番めの例では、起点となった&lt;a&gt;タグと同じパートじゃないにも関わらず、最後の&lt;p&gt;タグが示されています。
これらのメソッドでは、問題はフィルターにマッチするか否かと、スタートした要素よりも後にでてきたかということが問われます。(!要改善)</p>
</div>
<div class="section" id="find-all-previous-find-previous">
<h2><tt class="docutils literal"><span class="pre">find_all_previous()</span></tt> / <tt class="docutils literal"><span class="pre">find_previous()</span></tt><a class="headerlink" href="#find-all-previous-find-previous" title="Permalink to this headline">¶</a></h2>
<p>使い方: find_all_previous(<a class="reference internal" href="#name"><em>name</em></a>, <a class="reference internal" href="#attrs"><em>attrs</em></a>, <a class="reference internal" href="#text"><em>text</em></a>, <a class="reference internal" href="#limit"><em>limit</em></a>, <a class="reference internal" href="#kwargs"><em>**kwargs</em></a>)</p>
<p>使い方: find_previous(<a class="reference internal" href="#name"><em>name</em></a>, <a class="reference internal" href="#attrs"><em>attrs</em></a>, <a class="reference internal" href="#text"><em>text</em></a>, <a class="reference internal" href="#kwargs"><em>**kwargs</em></a>)</p>
<p>これらのメソッドは、ドキュメントの起点のタグの前にあらわれるタグと文字列の要素全てをイテレートして扱うために、 <a class="reference internal" href="#element-generators"><em>.previous_elements</em></a> メソッドを使います。(!要改善):</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">first_link</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">a</span>
<span class="n">first_link</span>
<span class="c"># &lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;</span>

<span class="n">first_link</span><span class="o">.</span><span class="n">find_all_previous</span><span class="p">(</span><span class="s">&quot;p&quot;</span><span class="p">)</span>
<span class="c"># [&lt;p class=&quot;story&quot;&gt;Once upon a time there were three little sisters; ...&lt;/p&gt;,</span>
<span class="c">#  &lt;p class=&quot;title&quot;&gt;&lt;b&gt;The Dormouse&#39;s story&lt;/b&gt;&lt;/p&gt;]</span>

<span class="n">first_link</span><span class="o">.</span><span class="n">find_previous</span><span class="p">(</span><span class="s">&quot;title&quot;</span><span class="p">)</span>
<span class="c"># &lt;title&gt;The Dormouse&#39;s story&lt;/title&gt;</span>
</pre></div>
</div>
<p><tt class="docutils literal"><span class="pre">find_all_previous(&quot;p&quot;)</span></tt> は&#8221;three sisters&#8221;ドキュメントの最初の段落を見つけます。(class=&#8221;title&#8221;のやつです)
しかし、第2段落でも見つけます。&lt;p&gt;タグは内に起点にした&lt;a&gt;タグを含んでいます。
驚きすぎないでください。
我々は、起点のタグより前方に現れた全てのタグを見ているのです。&lt;a&gt;タグを挟んでいる&lt;p&gt;タグは、&lt;a&gt;タグよりも前に示されねばなりません。(!要改善)</p>
</div>
<div class="section" id="id37">
<h2>CSSセレクタ<a class="headerlink" href="#id37" title="Permalink to this headline">¶</a></h2>
<p>Beautiful Soupは、よく使われるCSSセレクタをほとんどサポートしています。
<tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトや <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> オブジェクトに <tt class="docutils literal"><span class="pre">.select()</span></tt> メソッドで文字列を渡すだけで使えます。</p>
<p>タグを見つけるには次のようにします。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">&quot;title&quot;</span><span class="p">)</span>
<span class="c"># [&lt;title&gt;The Dormouse&#39;s story&lt;/title&gt;]</span>

<span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">&quot;p nth-of-type(3)&quot;</span><span class="p">)</span>
<span class="c"># [&lt;p class=&quot;story&quot;&gt;...&lt;/p&gt;]</span>
</pre></div>
</div>
<p>あるタグより後ろの指定されたタグを見つけます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">&quot;body a&quot;</span><span class="p">)</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot;  id=&quot;link2&quot;&gt;Lacie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/tillie&quot; id=&quot;link3&quot;&gt;Tillie&lt;/a&gt;]</span>

<span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">&quot;html head title&quot;</span><span class="p">)</span>
<span class="c"># [&lt;title&gt;The Dormouse&#39;s story&lt;/title&gt;]</span>
</pre></div>
</div>
<p>あるタグの直後の指定されたタグを見つけます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">&quot;head &gt; title&quot;</span><span class="p">)</span>
<span class="c"># [&lt;title&gt;The Dormouse&#39;s story&lt;/title&gt;]</span>

<span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">&quot;p &gt; a&quot;</span><span class="p">)</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot;  id=&quot;link2&quot;&gt;Lacie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/tillie&quot; id=&quot;link3&quot;&gt;Tillie&lt;/a&gt;]</span>

<span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">&quot;p &gt; a:nth-of-type(2)&quot;</span><span class="p">)</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot; id=&quot;link2&quot;&gt;Lacie&lt;/a&gt;]</span>

<span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">&quot;p &gt; #link1&quot;</span><span class="p">)</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;]</span>

<span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">&quot;body &gt; a&quot;</span><span class="p">)</span>
<span class="c"># []</span>
</pre></div>
</div>
<p>タグの兄弟要素を見つけます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">&quot;#link1 ~ .sister&quot;</span><span class="p">)</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot; id=&quot;link2&quot;&gt;Lacie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/tillie&quot;  id=&quot;link3&quot;&gt;Tillie&lt;/a&gt;]</span>

<span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">&quot;#link1 + .sister&quot;</span><span class="p">)</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot; id=&quot;link2&quot;&gt;Lacie&lt;/a&gt;]</span>
</pre></div>
</div>
<p>CSSクラスによってタグを見つけます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">&quot;.sister&quot;</span><span class="p">)</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot; id=&quot;link2&quot;&gt;Lacie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/tillie&quot; id=&quot;link3&quot;&gt;Tillie&lt;/a&gt;]</span>

<span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">&quot;[class~=sister]&quot;</span><span class="p">)</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot; id=&quot;link2&quot;&gt;Lacie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/tillie&quot; id=&quot;link3&quot;&gt;Tillie&lt;/a&gt;]</span>
</pre></div>
</div>
<p>CSSのIDによってタグを見つけます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">&quot;#link1&quot;</span><span class="p">)</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;]</span>

<span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">&quot;a#link2&quot;</span><span class="p">)</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot; id=&quot;link2&quot;&gt;Lacie&lt;/a&gt;]</span>
</pre></div>
</div>
<p>指定の属性の有無でタグを見つけます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">&#39;a[href]&#39;</span><span class="p">)</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot; id=&quot;link2&quot;&gt;Lacie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/tillie&quot; id=&quot;link3&quot;&gt;Tillie&lt;/a&gt;]</span>
</pre></div>
</div>
<p>属性が持つ値によってタグを見つけます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">&#39;a[href=&quot;http://example.com/elsie&quot;]&#39;</span><span class="p">)</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;]</span>

<span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">&#39;a[href^=&quot;http://example.com/&quot;]&#39;</span><span class="p">)</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot; id=&quot;link2&quot;&gt;Lacie&lt;/a&gt;,</span>
<span class="c">#  &lt;a class=&quot;sister&quot; href=&quot;http://example.com/tillie&quot; id=&quot;link3&quot;&gt;Tillie&lt;/a&gt;]</span>

<span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">&#39;a[href$=&quot;tillie&quot;]&#39;</span><span class="p">)</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/tillie&quot; id=&quot;link3&quot;&gt;Tillie&lt;/a&gt;]</span>

<span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">&#39;a[href*=&quot;.com/el&quot;]&#39;</span><span class="p">)</span>
<span class="c"># [&lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;]</span>
</pre></div>
</div>
<p>languageコードで、マッチさせます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">multilingual_markup</span> <span class="o">=</span> <span class="s">&quot;&quot;&quot;</span>
<span class="s"> &lt;p lang=&quot;en&quot;&gt;Hello&lt;/p&gt;</span>
<span class="s"> &lt;p lang=&quot;en-us&quot;&gt;Howdy, y&#39;all&lt;/p&gt;</span>
<span class="s"> &lt;p lang=&quot;en-gb&quot;&gt;Pip-pip, old fruit&lt;/p&gt;</span>
<span class="s"> &lt;p lang=&quot;fr&quot;&gt;Bonjour mes amis&lt;/p&gt;</span>
<span class="s">&quot;&quot;&quot;</span>
<span class="n">multilingual_soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">multilingual_markup</span><span class="p">)</span>
<span class="n">multilingual_soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">&#39;p[lang|=en]&#39;</span><span class="p">)</span>
<span class="c"># [&lt;p lang=&quot;en&quot;&gt;Hello&lt;/p&gt;,</span>
<span class="c">#  &lt;p lang=&quot;en-us&quot;&gt;Howdy, y&#39;all&lt;/p&gt;,</span>
<span class="c">#  &lt;p lang=&quot;en-gb&quot;&gt;Pip-pip, old fruit&lt;/p&gt;]</span>
</pre></div>
</div>
<p>このやり方は、CSSセレクタの文法を知っているユーザにとっては、とても便利です。
これでBeautiful Soup APIの全てのキモを使えるようになりました。
もしCSSセレクタを使いこなしたいなら、lxmlを使ってみるのもよいでしょう。
lxmlは処理がとても速く、さらに多くのCSSセレクタをサポートしています。
しかし、ここではBeautiful Soup APIを使って、シンプルなCSSセレクタの組み合わせるによる方法を説明しました。</p>
</div>
</div>
<div class="section" id="id38">
<h1>パースツリーを修正<a class="headerlink" href="#id38" title="Permalink to this headline">¶</a></h1>
<p>Beautiful Soupの主な強みは、パースツリーの検索するところにあります。
しかしまた、Beautiful Soupは、ツリーを修正したり、変更したツリーを新しいHTMLやXMLのドキュメントに出力することもできます。</p>
<div class="section" id="id39">
<h2>名前や属性の変更<a class="headerlink" href="#id39" title="Permalink to this headline">¶</a></h2>
<p><a class="reference internal" href="#id14">属性</a> の節でも述べましたが、タグの名前変更、属性値の変更、追加、削除ができます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">&#39;&lt;b class=&quot;boldest&quot;&gt;Extremely bold&lt;/b&gt;&#39;</span><span class="p">)</span>
<span class="n">tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">b</span>

<span class="n">tag</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="s">&quot;blockquote&quot;</span>
<span class="n">tag</span><span class="p">[</span><span class="s">&#39;class&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s">&#39;verybold&#39;</span>
<span class="n">tag</span><span class="p">[</span><span class="s">&#39;id&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">tag</span>
<span class="c"># &lt;blockquote class=&quot;verybold&quot; id=&quot;1&quot;&gt;Extremely bold&lt;/blockquote&gt;</span>

<span class="k">del</span> <span class="n">tag</span><span class="p">[</span><span class="s">&#39;class&#39;</span><span class="p">]</span>
<span class="k">del</span> <span class="n">tag</span><span class="p">[</span><span class="s">&#39;id&#39;</span><span class="p">]</span>
<span class="n">tag</span>
<span class="c"># &lt;blockquote&gt;Extremely bold&lt;/blockquote&gt;</span>
</pre></div>
</div>
</div>
<div class="section" id="id40">
<h2><tt class="docutils literal"><span class="pre">.string</span></tt> の修正<a class="headerlink" href="#id40" title="Permalink to this headline">¶</a></h2>
<p><tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトの <tt class="docutils literal"><span class="pre">.string</span></tt> を変更すると、そのタグが挟む文字列がその値に変更されます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">markup</span> <span class="o">=</span> <span class="s">&#39;&lt;a href=&quot;http://example.com/&quot;&gt;I linked to &lt;i&gt;example.com&lt;/i&gt;&lt;/a&gt;&#39;</span>
<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">markup</span><span class="p">)</span>

<span class="n">tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">a</span>
<span class="n">tag</span><span class="o">.</span><span class="n">string</span> <span class="o">=</span> <span class="s">&quot;New link text.&quot;</span>
<span class="n">tag</span>
<span class="c"># &lt;a href=&quot;http://example.com/&quot;&gt;New link text.&lt;/a&gt;</span>
</pre></div>
</div>
<p>注意点: 変更したタグが他のタグを挟んでいると、それらのタグ全てが破壊されます。</p>
</div>
<div class="section" id="append">
<h2><tt class="docutils literal"><span class="pre">append()</span></tt><a class="headerlink" href="#append" title="Permalink to this headline">¶</a></h2>
<p><tt class="docutils literal"><span class="pre">Tag.append()</span></tt> により、タグが挟んでいる文字列に追加をすることができます。
まるでPythonのリストの <tt class="docutils literal"><span class="pre">.append()</span></tt> のように作用します。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">&quot;&lt;a&gt;Foo&lt;/a&gt;&quot;</span><span class="p">)</span>
<span class="n">soup</span><span class="o">.</span><span class="n">a</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">&quot;Bar&quot;</span><span class="p">)</span>

<span class="n">soup</span>
<span class="c"># &lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;a&gt;FooBar&lt;/a&gt;&lt;/body&gt;&lt;/html&gt;</span>
<span class="n">soup</span><span class="o">.</span><span class="n">a</span><span class="o">.</span><span class="n">contents</span>
<span class="c"># [u&#39;Foo&#39;, u&#39;Bar&#39;]</span>
</pre></div>
</div>
</div>
<div class="section" id="beautifulsoup-new-string-new-tag">
<h2><tt class="docutils literal"><span class="pre">BeautifulSoup.new_string()</span></tt> / <tt class="docutils literal"><span class="pre">.new_tag()</span></tt><a class="headerlink" href="#beautifulsoup-new-string-new-tag" title="Permalink to this headline">¶</a></h2>
<p>ドキュメントに文字列を加えたいときは、Pythonの文字列を <tt class="docutils literal"><span class="pre">append()</span></tt> に渡してください。
もしくは、 <a class="reference external" href="http://ja.wikipedia.org/wiki/Factory_Method_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3">factory method</a> の <tt class="docutils literal"><span class="pre">BeautifulSoup.new_string()</span></tt> を呼出してください。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">&quot;&lt;b&gt;&lt;/b&gt;&quot;</span><span class="p">)</span>
<span class="n">tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">b</span>
<span class="n">tag</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">&quot;Hello&quot;</span><span class="p">)</span>
<span class="n">new_string</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">new_string</span><span class="p">(</span><span class="s">&quot; there&quot;</span><span class="p">)</span>
<span class="n">tag</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">new_string</span><span class="p">)</span>
<span class="n">tag</span>
<span class="c"># &lt;b&gt;Hello there.&lt;/b&gt;</span>
<span class="n">tag</span><span class="o">.</span><span class="n">contents</span>
<span class="c"># [u&#39;Hello&#39;, u&#39; there&#39;]</span>
</pre></div>
</div>
<p>新しいコメントや 他の <tt class="docutils literal"><span class="pre">NavigableString</span></tt> のサブクラスを生成したいときは、 <tt class="docutils literal"><span class="pre">new_string()</span></tt> の第2引数にそのクラスを渡してください。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">bs4</span> <span class="kn">import</span> <span class="n">Comment</span>
<span class="n">new_comment</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">new_string</span><span class="p">(</span><span class="s">&quot;Nice to see you.&quot;</span><span class="p">,</span> <span class="n">Comment</span><span class="p">)</span>
<span class="n">tag</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">new_comment</span><span class="p">)</span>
<span class="n">tag</span>
<span class="c"># &lt;b&gt;Hello there&lt;!--Nice to see you.--&gt;&lt;/b&gt;</span>
<span class="n">tag</span><span class="o">.</span><span class="n">contents</span>
<span class="c"># [u&#39;Hello&#39;, u&#39; there&#39;, u&#39;Nice to see you.&#39;]</span>
</pre></div>
</div>
<p>(これはBeautiful Soup 4.2.1 の新機能です)</p>
<p>完全に新しいタグを生成したいときは、factory methodの <tt class="docutils literal"><span class="pre">BeautifulSoup.new_tag()</span></tt> を呼び出してください。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">&quot;&lt;b&gt;&lt;/b&gt;&quot;</span><span class="p">)</span>
<span class="n">original_tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">b</span>

<span class="n">new_tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">new_tag</span><span class="p">(</span><span class="s">&quot;a&quot;</span><span class="p">,</span> <span class="n">href</span><span class="o">=</span><span class="s">&quot;http://www.example.com&quot;</span><span class="p">)</span>
<span class="n">original_tag</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">new_tag</span><span class="p">)</span>
<span class="n">original_tag</span>
<span class="c"># &lt;b&gt;&lt;a href=&quot;http://www.example.com&quot;&gt;&lt;/a&gt;&lt;/b&gt;</span>

<span class="n">new_tag</span><span class="o">.</span><span class="n">string</span> <span class="o">=</span> <span class="s">&quot;Link text.&quot;</span>
<span class="n">original_tag</span>
<span class="c"># &lt;b&gt;&lt;a href=&quot;http://www.example.com&quot;&gt;Link text.&lt;/a&gt;&lt;/b&gt;</span>
</pre></div>
</div>
<p>第1引数のタグ名だけは必須です。</p>
</div>
<div class="section" id="insert">
<h2><tt class="docutils literal"><span class="pre">insert()</span></tt><a class="headerlink" href="#insert" title="Permalink to this headline">¶</a></h2>
<p><tt class="docutils literal"><span class="pre">Tag.insert()</span></tt> は <tt class="docutils literal"><span class="pre">Tag.append()</span></tt> に似ています。
違うのは、タグの <tt class="docutils literal"><span class="pre">.contents</span></tt> の最後以外にも、要素を挿入できるという点です。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">markup</span> <span class="o">=</span> <span class="s">&#39;&lt;a href=&quot;http://example.com/&quot;&gt;I linked to &lt;i&gt;example.com&lt;/i&gt;&lt;/a&gt;&#39;</span>
<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">markup</span><span class="p">)</span>
<span class="n">tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">a</span>

<span class="n">tag</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="s">&quot;but did not endorse &quot;</span><span class="p">)</span>
<span class="n">tag</span>
<span class="c"># &lt;a href=&quot;http://example.com/&quot;&gt;I linked to but did not endorse &lt;i&gt;example.com&lt;/i&gt;&lt;/a&gt;</span>
<span class="n">tag</span><span class="o">.</span><span class="n">contents</span>
<span class="c"># [u&#39;I linked to &#39;, u&#39;but did not endorse&#39;, &lt;i&gt;example.com&lt;/i&gt;]</span>
</pre></div>
</div>
</div>
<div class="section" id="insert-before-insert-after">
<h2><tt class="docutils literal"><span class="pre">insert_before()</span></tt> / <tt class="docutils literal"><span class="pre">insert_after()</span></tt><a class="headerlink" href="#insert-before-insert-after" title="Permalink to this headline">¶</a></h2>
<p><tt class="docutils literal"><span class="pre">insert_before()</span></tt> メソッドは、あるタグの直前に、別のタグや文字列を挿入します。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">&quot;&lt;b&gt;stop&lt;/b&gt;&quot;</span><span class="p">)</span>
<span class="n">tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">new_tag</span><span class="p">(</span><span class="s">&quot;i&quot;</span><span class="p">)</span>
<span class="n">tag</span><span class="o">.</span><span class="n">string</span> <span class="o">=</span> <span class="s">&quot;Don&#39;t&quot;</span>
<span class="n">soup</span><span class="o">.</span><span class="n">b</span><span class="o">.</span><span class="n">string</span><span class="o">.</span><span class="n">insert_before</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span>
<span class="n">soup</span><span class="o">.</span><span class="n">b</span>
<span class="c"># &lt;b&gt;&lt;i&gt;Don&#39;t&lt;/i&gt;stop&lt;/b&gt;</span>
</pre></div>
</div>
<p><tt class="docutils literal"><span class="pre">insert_after()</span></tt> メソッドは、あるタグの直後に、別のタグや文字列を挿入します。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">b</span><span class="o">.</span><span class="n">i</span><span class="o">.</span><span class="n">insert_after</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">new_string</span><span class="p">(</span><span class="s">&quot; ever &quot;</span><span class="p">))</span>
<span class="n">soup</span><span class="o">.</span><span class="n">b</span>
<span class="c"># &lt;b&gt;&lt;i&gt;Don&#39;t&lt;/i&gt; ever stop&lt;/b&gt;</span>
<span class="n">soup</span><span class="o">.</span><span class="n">b</span><span class="o">.</span><span class="n">contents</span>
<span class="c"># [&lt;i&gt;Don&#39;t&lt;/i&gt;, u&#39; ever &#39;, u&#39;stop&#39;]</span>
</pre></div>
</div>
</div>
<div class="section" id="clear">
<h2><tt class="docutils literal"><span class="pre">clear()</span></tt><a class="headerlink" href="#clear" title="Permalink to this headline">¶</a></h2>
<p><tt class="docutils literal"><span class="pre">Tag.clear()</span></tt> は、タグが挟んでいるcontentsを削除します。(訳注:要チェック?):</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">markup</span> <span class="o">=</span> <span class="s">&#39;&lt;a href=&quot;http://example.com/&quot;&gt;I linked to &lt;i&gt;example.com&lt;/i&gt;&lt;/a&gt;&#39;</span>
<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">markup</span><span class="p">)</span>
<span class="n">tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">a</span>

<span class="n">tag</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="n">tag</span>
<span class="c"># &lt;a href=&quot;http://example.com/&quot;&gt;&lt;/a&gt;</span>
</pre></div>
</div>
</div>
<div class="section" id="extract">
<h2><tt class="docutils literal"><span class="pre">extract()</span></tt><a class="headerlink" href="#extract" title="Permalink to this headline">¶</a></h2>
<p><tt class="docutils literal"><span class="pre">PageElement.extract()</span></tt> はツリーからタグや文字列を除去します。
返値は、その抽出されたタグや文字列です。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">markup</span> <span class="o">=</span> <span class="s">&#39;&lt;a href=&quot;http://example.com/&quot;&gt;I linked to &lt;i&gt;example.com&lt;/i&gt;&lt;/a&gt;&#39;</span>
<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">markup</span><span class="p">)</span>
<span class="n">a_tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">a</span>

<span class="n">i_tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">i</span><span class="o">.</span><span class="n">extract</span><span class="p">()</span>

<span class="n">a_tag</span>
<span class="c"># &lt;a href=&quot;http://example.com/&quot;&gt;I linked to&lt;/a&gt;</span>

<span class="n">i_tag</span>
<span class="c"># &lt;i&gt;example.com&lt;/i&gt;</span>

<span class="k">print</span><span class="p">(</span><span class="n">i_tag</span><span class="o">.</span><span class="n">parent</span><span class="p">)</span>
<span class="bp">None</span>
</pre></div>
</div>
<p>このとき、2つのパースツリーがあります。1つは <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> オブジェクトを根ノードとしたあなたがパースしたドキュメントです。もう1つは、抽出したタグを根ノードとするものです。抽出した要素の子要素を <tt class="docutils literal"><span class="pre">extract</span></tt> でコールできます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">my_string</span> <span class="o">=</span> <span class="n">i_tag</span><span class="o">.</span><span class="n">string</span><span class="o">.</span><span class="n">extract</span><span class="p">()</span>
<span class="n">my_string</span>
<span class="c"># u&#39;example.com&#39;</span>

<span class="k">print</span><span class="p">(</span><span class="n">my_string</span><span class="o">.</span><span class="n">parent</span><span class="p">)</span>
<span class="c"># None</span>
<span class="n">i_tag</span>
<span class="c"># &lt;i&gt;&lt;/i&gt;</span>
</pre></div>
</div>
</div>
<div class="section" id="decompose">
<h2><tt class="docutils literal"><span class="pre">decompose()</span></tt><a class="headerlink" href="#decompose" title="Permalink to this headline">¶</a></h2>
<p><tt class="docutils literal"><span class="pre">Tag.decompose()</span></tt> はパースツリーからタグを除去します。
<strong>そのタグと挟んでいるcontentsを完全に削除します</strong></p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">markup</span> <span class="o">=</span> <span class="s">&#39;&lt;a href=&quot;http://example.com/&quot;&gt;I linked to &lt;i&gt;example.com&lt;/i&gt;&lt;/a&gt;&#39;</span>
<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">markup</span><span class="p">)</span>
<span class="n">a_tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">a</span>

<span class="n">soup</span><span class="o">.</span><span class="n">i</span><span class="o">.</span><span class="n">decompose</span><span class="p">()</span>

<span class="n">a_tag</span>
<span class="c"># &lt;a href=&quot;http://example.com/&quot;&gt;I linked to&lt;/a&gt;</span>
</pre></div>
</div>
</div>
<div class="section" id="replace-with">
<span id="id41"></span><h2><tt class="docutils literal"><span class="pre">replace_with()</span></tt><a class="headerlink" href="#replace-with" title="Permalink to this headline">¶</a></h2>
<p><tt class="docutils literal"><span class="pre">PageElement.replace_with()</span></tt> はツリーからタグと文字列を除去し、
引数に与えたタグや文字をその代わりに置き換えます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">markup</span> <span class="o">=</span> <span class="s">&#39;&lt;a href=&quot;http://example.com/&quot;&gt;I linked to &lt;i&gt;example.com&lt;/i&gt;&lt;/a&gt;&#39;</span>
<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">markup</span><span class="p">)</span>
<span class="n">a_tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">a</span>

<span class="n">new_tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">new_tag</span><span class="p">(</span><span class="s">&quot;b&quot;</span><span class="p">)</span>
<span class="n">new_tag</span><span class="o">.</span><span class="n">string</span> <span class="o">=</span> <span class="s">&quot;example.net&quot;</span>
<span class="n">a_tag</span><span class="o">.</span><span class="n">i</span><span class="o">.</span><span class="n">replace_with</span><span class="p">(</span><span class="n">new_tag</span><span class="p">)</span>

<span class="n">a_tag</span>
<span class="c"># &lt;a href=&quot;http://example.com/&quot;&gt;I linked to &lt;b&gt;example.net&lt;/b&gt;&lt;/a&gt;</span>
</pre></div>
</div>
<p><tt class="docutils literal"><span class="pre">replace_with()</span></tt> は置き換えられたタグや文字列を返します。
それを、調査したり、ツリーの他の部分に加えることができます。</p>
</div>
<div class="section" id="wrap">
<h2><tt class="docutils literal"><span class="pre">wrap()</span></tt><a class="headerlink" href="#wrap" title="Permalink to this headline">¶</a></h2>
<p><tt class="docutils literal"><span class="pre">PageElement.wrap()</span></tt> は、その要素を引数で指定したタグを挟みます。
新しく挟まれたものを返します。</p>
<div class="highlight-python"><pre>soup = BeautifulSoup("&lt;p&gt;I wish I was bold.&lt;/p&gt;")
soup.p.string.wrap(soup.new_tag("b"))
# &lt;b&gt;I wish I was bold.&lt;/b&gt;

soup.p.wrap(soup.new_tag("div")
# &lt;div&gt;&lt;p&gt;&lt;b&gt;I wish I was bold.&lt;/b&gt;&lt;/p&gt;&lt;/div&gt;</pre>
</div>
<p>このメソッドは、Beautiful Soup 4.0.5 からの新機能です。</p>
</div>
<div class="section" id="unwrap">
<h2><tt class="docutils literal"><span class="pre">unwrap()</span></tt><a class="headerlink" href="#unwrap" title="Permalink to this headline">¶</a></h2>
<p><tt class="docutils literal"><span class="pre">Tag.unwrap()</span></tt> は <tt class="docutils literal"><span class="pre">wrap()</span></tt> の反対です。
それは、タグの中身がなんであれ、それとタグを置き換えます。
マークアップをはずすのに便利です。(訳注:やりなおし??):</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">markup</span> <span class="o">=</span> <span class="s">&#39;&lt;a href=&quot;http://example.com/&quot;&gt;I linked to &lt;i&gt;example.com&lt;/i&gt;&lt;/a&gt;&#39;</span>
<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">markup</span><span class="p">)</span>
<span class="n">a_tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">a</span>

<span class="n">a_tag</span><span class="o">.</span><span class="n">i</span><span class="o">.</span><span class="n">unwrap</span><span class="p">()</span>
<span class="n">a_tag</span>
<span class="c"># &lt;a href=&quot;http://example.com/&quot;&gt;I linked to example.com&lt;/a&gt;</span>
</pre></div>
</div>
<p><tt class="docutils literal"><span class="pre">replace_with()</span></tt> のように、 <tt class="docutils literal"><span class="pre">unwrap()</span></tt> は置き換えられたタグを返します。</p>
</div>
</div>
<div class="section" id="id42">
<h1>出力<a class="headerlink" href="#id42" title="Permalink to this headline">¶</a></h1>
<span class="target" id="prettyprinting"></span><div class="section" id="id43">
<h2>きれいに出力<a class="headerlink" href="#id43" title="Permalink to this headline">¶</a></h2>
<p><tt class="docutils literal"><span class="pre">prettify()</span></tt> メソッドは、BeautifulSoupパースツリーを、1行に1タグのきれいにフォーマットされたUnicode文字列に変換します。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">markup</span> <span class="o">=</span> <span class="s">&#39;&lt;a href=&quot;http://example.com/&quot;&gt;I linked to &lt;i&gt;example.com&lt;/i&gt;&lt;/a&gt;&#39;</span>
<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">markup</span><span class="p">)</span>
<span class="n">soup</span><span class="o">.</span><span class="n">prettify</span><span class="p">()</span>
<span class="c"># &#39;&lt;html&gt;\n &lt;head&gt;\n &lt;/head&gt;\n &lt;body&gt;\n  &lt;a href=&quot;http://example.com/&quot;&gt;\n...&#39;</span>

<span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">prettify</span><span class="p">())</span>
<span class="c"># &lt;html&gt;</span>
<span class="c">#  &lt;head&gt;</span>
<span class="c">#  &lt;/head&gt;</span>
<span class="c">#  &lt;body&gt;</span>
<span class="c">#   &lt;a href=&quot;http://example.com/&quot;&gt;</span>
<span class="c">#    I linked to</span>
<span class="c">#    &lt;i&gt;</span>
<span class="c">#     example.com</span>
<span class="c">#    &lt;/i&gt;</span>
<span class="c">#   &lt;/a&gt;</span>
<span class="c">#  &lt;/body&gt;</span>
<span class="c"># &lt;/html&gt;</span>
</pre></div>
</div>
<p><tt class="docutils literal"><span class="pre">prettify()</span></tt> メソッドは、 トップレベルの <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> オブジェクトでも、それ以外の <tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトでも呼び出すことができます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">a</span><span class="o">.</span><span class="n">prettify</span><span class="p">())</span>
<span class="c"># &lt;a href=&quot;http://example.com/&quot;&gt;</span>
<span class="c">#  I linked to</span>
<span class="c">#  &lt;i&gt;</span>
<span class="c">#   example.com</span>
<span class="c">#  &lt;/i&gt;</span>
<span class="c"># &lt;/a&gt;</span>
</pre></div>
</div>
</div>
<div class="section" id="id44">
<h2>一行に出力<a class="headerlink" href="#id44" title="Permalink to this headline">¶</a></h2>
<p>フォーマットされたテキストではなく単なる文字列がほしければ、 <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> や <tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトの <tt class="docutils literal"><span class="pre">unicode()</span></tt> や <tt class="docutils literal"><span class="pre">str()</span></tt> を呼び出せます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="nb">str</span><span class="p">(</span><span class="n">soup</span><span class="p">)</span>
<span class="c"># &#39;&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;a href=&quot;http://example.com/&quot;&gt;I linked to &lt;i&gt;example.com&lt;/i&gt;&lt;/a&gt;&lt;/body&gt;&lt;/html&gt;&#39;</span>

<span class="nb">unicode</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">a</span><span class="p">)</span>
<span class="c"># u&#39;&lt;a href=&quot;http://example.com/&quot;&gt;I linked to &lt;i&gt;example.com&lt;/i&gt;&lt;/a&gt;&#39;</span>
</pre></div>
</div>
<p><tt class="docutils literal"><span class="pre">str()</span></tt> 関数は、UTF-8にエンコードされた文字列を返します。
他のオプションを知りたければ、 <a class="reference internal" href="#id48">エンコード</a>  をみてください。</p>
<p>バイト文字列を得るのに、 <tt class="docutils literal"><span class="pre">encode()</span></tt> を用いることもできます。
<tt class="docutils literal"><span class="pre">decode()</span></tt> を用いると、Unicodeを得ることができます。</p>
<span class="target" id="output-formatters"></span></div>
<div class="section" id="id45">
<h2>フォーマットを指定<a class="headerlink" href="#id45" title="Permalink to this headline">¶</a></h2>
<p>Beautiful Soupに、&#8221;&amp;lquot;&#8221;のようなHTMLエンティティを含んだドキュメントを渡すと、それらはUnicodeキャラクタに変換されます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">&quot;&amp;ldquo;Dammit!&amp;rdquo; he said.&quot;</span><span class="p">)</span>
<span class="nb">unicode</span><span class="p">(</span><span class="n">soup</span><span class="p">)</span>
<span class="c"># u&#39;&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;\u201cDammit!\u201d he said.&lt;/body&gt;&lt;/html&gt;&#39;</span>
</pre></div>
</div>
<p>そのドキュメントを文字列に変換すると、Unicode文字列はUTF-8キャラクタとしてエンコードされます。
それを、HTMLエンティティに戻すことはできません。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="nb">str</span><span class="p">(</span><span class="n">soup</span><span class="p">)</span>
<span class="c"># &#39;&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;\xe2\x80\x9cDammit!\xe2\x80\x9d he said.&lt;/body&gt;&lt;/html&gt;&#39;</span>
</pre></div>
</div>
<p>デフォルトでは、出力するときエスケープされるのは、裸の&amp;と角かっこのみです。
これらは、&#8221;&amp;amp;&#8221;,&#8221;&amp;lt;&#8221;,&#8221;&amp;gt&#8221;に変換されます。
そのためBeautifulSoupはうっかり不正確なHTMLやXMLを生成することはありません。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">&quot;&lt;p&gt;The law firm of Dewey, Cheatem, &amp; Howe&lt;/p&gt;&quot;</span><span class="p">)</span>
<span class="n">soup</span><span class="o">.</span><span class="n">p</span>
<span class="c"># &lt;p&gt;The law firm of Dewey, Cheatem, &amp;amp; Howe&lt;/p&gt;</span>

<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">&#39;&lt;a href=&quot;http://example.com/?foo=val1&amp;bar=val2&quot;&gt;A link&lt;/a&gt;&#39;</span><span class="p">)</span>
<span class="n">soup</span><span class="o">.</span><span class="n">a</span>
<span class="c"># &lt;a href=&quot;http://example.com/?foo=val1&amp;amp;bar=val2&quot;&gt;A link&lt;/a&gt;</span>
</pre></div>
</div>
<p><tt class="docutils literal"><span class="pre">prettify()</span></tt>, <tt class="docutils literal"><span class="pre">encode()</span></tt>, <tt class="docutils literal"><span class="pre">decode()</span></tt> の <tt class="docutils literal"><span class="pre">formatter</span></tt> 属性に値を与えると、出力を変更することができます。
<tt class="docutils literal"><span class="pre">formatter</span></tt> は、4種類の値をとり得ます。</p>
<p>デフォルトでは、 <tt class="docutils literal"><span class="pre">formatter=&quot;minimal&quot;</span></tt> です。
文字列は、Beautiful Soupが正しいHTML/XMLを生成することを十分に保証するように、加工されるだけです。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">french</span> <span class="o">=</span> <span class="s">&quot;&lt;p&gt;Il a dit &amp;lt;&amp;lt;Sacr&amp;eacute; bleu!&amp;gt;&amp;gt;&lt;/p&gt;&quot;</span>
<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">french</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">prettify</span><span class="p">(</span><span class="n">formatter</span><span class="o">=</span><span class="s">&quot;minimal&quot;</span><span class="p">))</span>
<span class="c"># &lt;html&gt;</span>
<span class="c">#  &lt;body&gt;</span>
<span class="c">#   &lt;p&gt;</span>
<span class="c">#    Il a dit &amp;lt;&amp;lt;Sacrテゥ bleu!&amp;gt;&amp;gt;</span>
<span class="c">#   &lt;/p&gt;</span>
<span class="c">#  &lt;/body&gt;</span>
<span class="c"># &lt;/html&gt;</span>
</pre></div>
</div>
<p>もし、 <tt class="docutils literal"><span class="pre">formatter=&quot;html&quot;</span></tt> を渡せば、BSは 可能なときはいつでも、Unicode文字列を HTMLエンティティに変換します。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">prettify</span><span class="p">(</span><span class="n">formatter</span><span class="o">=</span><span class="s">&quot;html&quot;</span><span class="p">))</span>
<span class="c"># &lt;html&gt;</span>
<span class="c">#  &lt;body&gt;</span>
<span class="c">#   &lt;p&gt;</span>
<span class="c">#    Il a dit &amp;lt;&amp;lt;Sacr&amp;eacute; bleu!&amp;gt;&amp;gt;</span>
<span class="c">#   &lt;/p&gt;</span>
<span class="c">#  &lt;/body&gt;</span>
<span class="c"># &lt;/html&gt;</span>
</pre></div>
</div>
<p>もし、 <tt class="docutils literal"><span class="pre">formatter=None</span></tt> を渡せば、BSは出力においてまったく文字列を修正しません。
これは、最速のオプションですが、BSが正しくないHTML/XMLを生成することになります。
次の例をご覧ください。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">prettify</span><span class="p">(</span><span class="n">formatter</span><span class="o">=</span><span class="bp">None</span><span class="p">))</span>
<span class="c"># &lt;html&gt;</span>
<span class="c">#  &lt;body&gt;</span>
<span class="c">#   &lt;p&gt;</span>
<span class="c">#    Il a dit &lt;&lt;Sacrテゥ bleu!&gt;&gt;</span>
<span class="c">#   &lt;/p&gt;</span>
<span class="c">#  &lt;/body&gt;</span>
<span class="c"># &lt;/html&gt;</span>

<span class="n">link_soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">&#39;&lt;a href=&quot;http://example.com/?foo=val1&amp;bar=val2&quot;&gt;A link&lt;/a&gt;&#39;</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">link_soup</span><span class="o">.</span><span class="n">a</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="n">formatter</span><span class="o">=</span><span class="bp">None</span><span class="p">))</span>
<span class="c"># &lt;a href=&quot;http://example.com/?foo=val1&amp;bar=val2&quot;&gt;A link&lt;/a&gt;</span>
</pre></div>
</div>
<p><tt class="docutils literal"><span class="pre">formatter</span></tt> に関数を渡すと、ドキュメントの文字列や属性値のたびに、BSはその関数をコールします。
関数内で望むことはなんであれできます。
以下では、formatterは文字列を大文字にコンバートし、他には何もしません。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">uppercase</span><span class="p">(</span><span class="nb">str</span><span class="p">):</span>
    <span class="k">return</span> <span class="nb">str</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span>

<span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">prettify</span><span class="p">(</span><span class="n">formatter</span><span class="o">=</span><span class="n">uppercase</span><span class="p">))</span>
<span class="c"># &lt;html&gt;</span>
<span class="c">#  &lt;body&gt;</span>
<span class="c">#   &lt;p&gt;</span>
<span class="c">#    IL A DIT &lt;&lt;SACRテ BLEU!&gt;&gt;</span>
<span class="c">#   &lt;/p&gt;</span>
<span class="c">#  &lt;/body&gt;</span>
<span class="c"># &lt;/html&gt;</span>

<span class="k">print</span><span class="p">(</span><span class="n">link_soup</span><span class="o">.</span><span class="n">a</span><span class="o">.</span><span class="n">prettify</span><span class="p">(</span><span class="n">formatter</span><span class="o">=</span><span class="n">uppercase</span><span class="p">))</span>
<span class="c"># &lt;a href=&quot;HTTP://EXAMPLE.COM/?FOO=VAL1&amp;BAR=VAL2&quot;&gt;</span>
<span class="c">#  A LINK</span>
<span class="c"># &lt;/a&gt;</span>
</pre></div>
</div>
<p>もしあなたがあなたの関数を書いたなら、あなたは <tt class="docutils literal"><span class="pre">bs4.dammit</span></tt> の  <tt class="docutils literal"><span class="pre">EntitySubstitution</span></tt> クラスについて知るべきです。
このクラスは、BSの標準的なformatter をクラスメソッドとして内包します。
&#8220;html&#8221; formatterは    <tt class="docutils literal"><span class="pre">EntitySubstitution.substitute_html</span></tt> ,
&#8220;minimal&#8221; formatterは <tt class="docutils literal"><span class="pre">EntitySubstitution.substitute_xml</span></tt> です。
あなたは、これらの関数を、 <tt class="docutils literal"><span class="pre">formatter==html</span></tt> や <tt class="docutils literal"><span class="pre">formatter==minimal</span></tt> をシュミレーションします。
しかし、それに加えて他のこともします。</p>
<p>これは例です。UnicodeキャラクタをHTMLエンティティに置換します。可能なときはいつでも。
しかし、 <strong>また</strong> 全ての文字列を大文字に変換します。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">bs4.dammit</span> <span class="kn">import</span> <span class="n">EntitySubstitution</span>
<span class="k">def</span> <span class="nf">uppercase_and_substitute_html_entities</span><span class="p">(</span><span class="nb">str</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">EntitySubstitution</span><span class="o">.</span><span class="n">substitute_html</span><span class="p">(</span><span class="nb">str</span><span class="o">.</span><span class="n">upper</span><span class="p">())</span>

<span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">prettify</span><span class="p">(</span><span class="n">formatter</span><span class="o">=</span><span class="n">uppercase_and_substitute_html_entities</span><span class="p">))</span>
<span class="c"># &lt;html&gt;</span>
<span class="c">#  &lt;body&gt;</span>
<span class="c">#   &lt;p&gt;</span>
<span class="c">#    IL A DIT &amp;lt;&amp;lt;SACR&amp;Eacute; BLEU!&amp;gt;&amp;gt;</span>
<span class="c">#   &lt;/p&gt;</span>
<span class="c">#  &lt;/body&gt;</span>
<span class="c"># &lt;/html&gt;</span>
</pre></div>
</div>
<p>最後に一点(最終通告?): もし <tt class="docutils literal"><span class="pre">CData</span></tt> オブジェクトを生成したときは、そのオブジェクト内のテキストは <strong>正確にあるがまま、フォーマットされることなく</strong> いつも表されます。
BSは formatterメソッドを呼出します。あなたがカスタムメソッドを書いた場合にのみ。どういうカスタムメソッド化というと、全てのドキュメント内の文字列やなにかをcountする。しかし、それは返り値を無視します。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">bs4.element</span> <span class="kn">import</span> <span class="n">CData</span>
<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">&quot;&lt;a&gt;&lt;/a&gt;&quot;</span><span class="p">)</span>
<span class="n">soup</span><span class="o">.</span><span class="n">a</span><span class="o">.</span><span class="n">string</span> <span class="o">=</span> <span class="n">CData</span><span class="p">(</span><span class="s">&quot;one &lt; three&quot;</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">a</span><span class="o">.</span><span class="n">prettify</span><span class="p">(</span><span class="n">formatter</span><span class="o">=</span><span class="s">&quot;xml&quot;</span><span class="p">))</span>
<span class="c"># &lt;a&gt;</span>
<span class="c">#  &lt;![CDATA[one &lt; three]]&gt;</span>
<span class="c"># &lt;/a&gt;</span>
</pre></div>
</div>
</div>
<div class="section" id="get-text">
<h2><tt class="docutils literal"><span class="pre">get_text()</span></tt><a class="headerlink" href="#get-text" title="Permalink to this headline">¶</a></h2>
<p>ドキュメントやタグのテキスト部分だけが取得したいときは、 <tt class="docutils literal"><span class="pre">get_text()</span></tt> メソッドを使います。
それは、全ドキュメントや下層のタグを、ユニコードの単一文字列として返します。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">markup</span> <span class="o">=</span> <span class="s">&#39;&lt;a href=&quot;http://example.com/&quot;&gt;</span><span class="se">\n</span><span class="s">I linked to &lt;i&gt;example.com&lt;/i&gt;</span><span class="se">\n</span><span class="s">&lt;/a&gt;&#39;</span>
<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">markup</span><span class="p">)</span>

<span class="n">soup</span><span class="o">.</span><span class="n">get_text</span><span class="p">()</span>
<span class="s">u&#39;</span><span class="se">\n</span><span class="s">I linked to example.com</span><span class="se">\n</span><span class="s">&#39;</span>
<span class="n">soup</span><span class="o">.</span><span class="n">i</span><span class="o">.</span><span class="n">get_text</span><span class="p">()</span>
<span class="s">u&#39;example.com&#39;</span>
</pre></div>
</div>
<p>テキストをまとめる際の区切り文字を指定することができます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="c"># soup.get_text(&quot;|&quot;)</span>
<span class="s">u&#39;</span><span class="se">\n</span><span class="s">I linked to |example.com|</span><span class="se">\n</span><span class="s">&#39;</span>
</pre></div>
</div>
<p>各文字列パーツの最初と最後の空白を除去することもできます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="c"># soup.get_text(&quot;|&quot;, strip=True)</span>
<span class="s">u&#39;I linked to|example.com&#39;</span>
</pre></div>
</div>
<p>空白を除去するのに、 <a class="reference internal" href="#string-generators"><em>stripped_strings</em></a> ジェネレーターを使って処理することもできます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="p">[</span><span class="n">text</span> <span class="k">for</span> <span class="n">text</span> <span class="ow">in</span> <span class="n">soup</span><span class="o">.</span><span class="n">stripped_strings</span><span class="p">]</span>
<span class="c"># [u&#39;I linked to&#39;, u&#39;example.com&#39;]</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="id46">
<h1>パーサーの指定<a class="headerlink" href="#id46" title="Permalink to this headline">¶</a></h1>
<p>もし貴方がいくつかのhtmlをパースしたいなら、あなたは、 <tt class="docutils literal"><span class="pre">Beautiful</span> <span class="pre">Soup</span></tt> コンストラクタに、マークアップをダンプできる。
それはたぶんうまくいきます。
Beautiful Soupはパーサーを選んで、データをパースします。
しかし、どのパーサーが使われるか変更するために、コンストラクタに渡すいくつかの引数があります</p>
<p>1つ目の <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> コンストラクタの引数は、 あなたがパースしたいマークアップの、文字列または開いているファイルハンドルです。
2つ目の引数は、<em>どのように</em> マークアップをぱーすするかについてです。</p>
<p>もし何も指定しなかった場合は、インストールされているなかで最高のHTMLパーサーを使います。
Beautiful Soupは、lxmlのパーサーを最高のものとしています。そして、html5libとPythonの組み込みパーサー。
あなたは次のうちの一つを指定することで、これを上書きできます。</p>
<ul class="simple">
<li>パースしたいマークアップの種類: サポートしているのは、&#8221;html&#8221;, &#8220;xml&#8221;, &#8220;html5&#8221;です。</li>
</ul>
<ul class="simple">
<li>パーサーライブラリの名前: オプションとしてサポートしているのは、&#8221;lxml&#8221;, &#8220;html5lib&#8221;, (Pythonの組み込みHTMLパーサーである) &#8220;html.parser&#8221;。</li>
</ul>
<p>この <a class="reference internal" href="#id10">パーサーのインストール</a> の章は、サポートしているパーサーを比較します。</p>
<p>もし適切なパーサーをインストールしていないときは、Beautiful Soupはあなたのリクエストを無視し、違うパーサーを選びます。
現在、ただ一つサポートされているXMLパーサーは、lxmlです。
もし、lxmlをインストールしてないとき、XMLの要求はあなたに何も与えませんし、&#8221;lxml&#8221;へのリクエストも動きません。(要改善!)</p>
<div class="section" id="id47">
<h2>パーサーの違い<a class="headerlink" href="#id47" title="Permalink to this headline">¶</a></h2>
<p>Beautiful Soupは多くの異なるパーサーに同じインターフェースを提供しています。
しかし、パーサーはそれぞれは異なります。
パーサーが異なると、同じドキュメントでも、生成されるパースツリーは異なってきます。
HTMLパーサーとXMLパーサーには大きな違いがあります。
以下は、短いドキュメントをHTMLとしてパースしたものです。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">&quot;&lt;a&gt;&lt;b /&gt;&lt;/a&gt;&quot;</span><span class="p">)</span>
<span class="c"># &lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;a&gt;&lt;b&gt;&lt;/b&gt;&lt;/a&gt;&lt;/body&gt;&lt;/html&gt;</span>
</pre></div>
</div>
<p>空の&lt;b /&gt;タグは、正式なHTMLではないため、パーサーはそれを&lt;b&gt;&lt;/b&gt;のタグの組に変換します。</p>
<p>以下は、同じドキュメントをXMLとしてパースしたものです。
(これを実行するにはlxmlをインストールしておく必要があります)
&lt;b /&gt;タグはそのまま残っており、ドキュメントはXML宣言が&lt;html&gt;タグの代わりに加えられたことに気づいてください。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">&quot;&lt;a&gt;&lt;b /&gt;&lt;/a&gt;&quot;</span><span class="p">,</span> <span class="s">&quot;xml&quot;</span><span class="p">)</span>
<span class="c"># &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;</span>
<span class="c"># &lt;a&gt;&lt;b/&gt;&lt;/a&gt;</span>
</pre></div>
</div>
<p>HTMLパーサー同士でも、違いはあります。
完全な形のHTMLドキュメントをBeautiful Soupに与えたときは、その違いは問題になりません。
あるパーサーは、他のパーサーよりも速いでしょう。
しかし、それらは全て元のHTMLドキュメントを正確に反映したデータ構造を与えるでしょう。</p>
<p>しかし、不完全な形のHTMLドキュメントのときは、異なるパーサーは異なる結果を出力します。
以下は、lxmlのHTMLパーサーによってパースされた短く不正なドキュメントです。
ぶらさがっている&lt;/p&gt;タグは、単に無視されていることに気づいてください。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">&quot;&lt;a&gt;&lt;/p&gt;&quot;</span><span class="p">,</span> <span class="s">&quot;lxml&quot;</span><span class="p">)</span>
<span class="c"># &lt;html&gt;&lt;body&gt;&lt;a&gt;&lt;/a&gt;&lt;/body&gt;&lt;/html&gt;</span>
</pre></div>
</div>
<p>以下は、html5libによってパースされた同じドキュメントです。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">&quot;&lt;a&gt;&lt;/p&gt;&quot;</span><span class="p">,</span> <span class="s">&quot;html5lib&quot;</span><span class="p">)</span>
<span class="c"># &lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;a&gt;&lt;p&gt;&lt;/p&gt;&lt;/a&gt;&lt;/body&gt;&lt;/html&gt;</span>
</pre></div>
</div>
<p>ぶらさがっている&lt;/p&gt;タグを無視する代わりに、html5libは、それを開始の&lt;p&gt;タグと組にしました。
このパーサーはまた、ドキュメントに空の&lt;head&gt;タグも加えました。</p>
<p>以下は、Python組み込みのHTMLパーサーで同じドキュメントをパースしたものです。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">&quot;&lt;a&gt;&lt;/p&gt;&quot;</span><span class="p">,</span> <span class="s">&quot;html.parser&quot;</span><span class="p">)</span>
<span class="c"># &lt;a&gt;&lt;/a&gt;</span>
</pre></div>
</div>
<p>html5libのように、このパーサーは終わりの&lt;/p&gt;タグを無視します。
html5libとは違い、このパーサーは&lt;body&gt;タグを加えて正しい書式のHTMLドキュメントを作成しようとはしません。
lxmlとは違い、なんとかして&lt;html&gt;タグを加えようとはしません。</p>
<p>&#8220;&lt;a&gt;&lt;/p&gt;&#8221;というドキュメントは不正なので、これについての&#8221;正しい&#8221;処理方法はありません。
html5libパーサーはhtml5標準のいち部分のテクニックを使います。
それは、ただしい主張を正しい方法についてします。しかし、これらの3つの方法全て、道理に合っています。(?あとで再チェック)</p>
<p>パーサー間の違いは、あなたのスクリプトにも影響するでしょう。
もし、スクリプトを他の人に配布したり、複数の計算機で実行しようとするならば、 <tt class="docutils literal"><span class="pre">Beautiful</span> <span class="pre">Soup</span></tt> コンストラクタについてパーサーを指定するべきです。
そうすることによって、あなたがパースした方法と違うやりかたでドキュメントをパースする可能性を減らすでしょう。</p>
</div>
</div>
<div class="section" id="id48">
<h1>エンコード<a class="headerlink" href="#id48" title="Permalink to this headline">¶</a></h1>
<p>HTMLやXMLドキュメントは全て、ASCIIやUTF-8のような特定の文字コードで書かれています。
しかし、BeautifulSoupにドキュメントをロードすると、それらはUnicode型に変換されます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">markup</span> <span class="o">=</span> <span class="s">&quot;&lt;h1&gt;Sacr</span><span class="se">\xc3\xa9</span><span class="s"> bleu!&lt;/h1&gt;&quot;</span>
<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">markup</span><span class="p">)</span>
<span class="n">soup</span><span class="o">.</span><span class="n">h1</span>
<span class="c"># &lt;h1&gt;Sacré bleu!&lt;/h1&gt;</span>
<span class="n">soup</span><span class="o">.</span><span class="n">h1</span><span class="o">.</span><span class="n">string</span>
<span class="c"># u&#39;Sacr\xe9 bleu!&#39;</span>
</pre></div>
</div>
<p>これは魔法ではありません。Beautiful Soupは <a class="reference internal" href="#unicode-dammit">Unicode, Dammit</a> を内部でライブラリとして呼び出し、文字コードを判別してUnicodeに変換するのに使っています。
自動判別された文字コードは、 <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> オブジェクトの <tt class="docutils literal"><span class="pre">.original_encoding</span></tt> 属性で参照することができます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">original_encoding</span>
<span class="s">&#39;utf-8&#39;</span>
</pre></div>
</div>
<p>Unicode, Dammit はほとんどの場合正しく判別しますが、たまに失敗します。
たいてい適切に判別しますが、バイト毎の検索の場合は、とてもながい時間がかかります。
もし、ドキュメントの文字コードが分かっているのなら、失敗や遅延を避けるために、 <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> コンストラクタに <tt class="docutils literal"><span class="pre">from_encoding</span></tt> として渡すとよいです。</p>
<p>次の例は、ISO-8859-8(訳注:ラテン文字等の文字コード)で書かれたドキュメントです。
このドキュメントは短いために、Unicode, Dammitはそれが何か判別できず、それをISO-8859-7(訳注:ギリシア文字等の文字コード)と誤認します。:</p>
<div class="highlight-python"><pre>markup = b"&lt;h1&gt;\xed\xe5\xec\xf9&lt;/h1&gt;"
soup = BeautifulSoup(markup)
soup.h1
&lt;h1&gt;νεμω&lt;/h1&gt;
soup.original_encoding
'ISO-8859-7'</pre>
</div>
<p>正しい <tt class="docutils literal"><span class="pre">from_encoding</span></tt> を渡すことで、これを正すことができます。:</p>
<div class="highlight-python"><pre>soup = BeautifulSoup(markup, from_encoding="iso-8859-8")
soup.h1
&lt;h1&gt;ם ו ל ש&lt;/h1&gt;
soup.original_encoding
'iso8859-8'</pre>
</div>
<p>(通常、UTF-8のドキュメントは複数の文字コードを含むことができますが、) ごくまれに、変換できない文字をユニコードの特殊文字&#8221;REPLACEMENT CHARACTER&#8221; (U+FFFD,�) に置き換えることがあります。
Unicode, Dammit がこれを行うときは、同時に、 <tt class="docutils literal"><span class="pre">UnicodeDammit</span></tt> か <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> オブジェクトの .contains_replacement_characters 属性にTrueをセットします。
これにより、変換後のユニコードの文字列は、元の文字コードの文字列を正確に表現しておらず、いくつかのデータが損なわれているということがわかります。
もし、 <tt class="docutils literal"><span class="pre">.contains_replacement_characters</span></tt> が <tt class="docutils literal"><span class="pre">False</span></tt> のときは、ドキュメント内に特殊文字�があっても、それは(この段落の�のように)もともとあり、データは損なわれていないということです。</p>
<div class="section" id="id49">
<h2>出力のエンコード<a class="headerlink" href="#id49" title="Permalink to this headline">¶</a></h2>
<p>Beautiful Soupでドキュメントを出力すると、元のドキュメントがUTF-8でなくても、UTF-8で出力されます。
次の例は、Latin-1で書かれたドキュメントについてです。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">markup</span> <span class="o">=</span> <span class="n">b</span><span class="s">&#39;&#39;&#39;</span>
<span class="s"> &lt;html&gt;</span>
<span class="s">  &lt;head&gt;</span>
<span class="s">   &lt;meta content=&quot;text/html; charset=ISO-Latin-1&quot; http-equiv=&quot;Content-type&quot; /&gt;</span>
<span class="s">  &lt;/head&gt;</span>
<span class="s">  &lt;body&gt;</span>
<span class="s">   &lt;p&gt;Sacr</span><span class="se">\xe9</span><span class="s"> bleu!&lt;/p&gt;</span>
<span class="s">  &lt;/body&gt;</span>
<span class="s"> &lt;/html&gt;</span>
<span class="s">&#39;&#39;&#39;</span>

<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">markup</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">prettify</span><span class="p">())</span>
<span class="c"># &lt;html&gt;</span>
<span class="c">#  &lt;head&gt;</span>
<span class="c">#   &lt;meta content=&quot;text/html; charset=utf-8&quot; http-equiv=&quot;Content-type&quot; /&gt;</span>
<span class="c">#  &lt;/head&gt;</span>
<span class="c">#  &lt;body&gt;</span>
<span class="c">#   &lt;p&gt;</span>
<span class="c">#    Sacrテゥ bleu!</span>
<span class="c">#   &lt;/p&gt;</span>
<span class="c">#  &lt;/body&gt;</span>
<span class="c"># &lt;/html&gt;</span>
</pre></div>
</div>
<p>&lt;meta&gt;タグは書き換えられ、ドキュメントが現在UTF-8であることを示しています。:</p>
<div class="highlight-python"><pre>.. If you don't want UTF-8, you can pass an encoding into ``prettify()``::</pre>
</div>
<p>UTF-8以外で出力したいときは、 <tt class="docutils literal"><span class="pre">prettify()</span></tt> にその文字コードを渡してください。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">prettify</span><span class="p">(</span><span class="s">&quot;latin-1&quot;</span><span class="p">))</span>
<span class="c"># &lt;html&gt;</span>
<span class="c">#  &lt;head&gt;</span>
<span class="c">#   &lt;meta content=&quot;text/html; charset=latin-1&quot; http-equiv=&quot;Content-type&quot; /&gt;</span>
<span class="c"># ...</span>
</pre></div>
</div>
<p>Pythonのstr型であるかのように、<tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> オブジェクトや、その要素のencode()をコールすることができます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">p</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&quot;latin-1&quot;</span><span class="p">)</span>
<span class="c"># &#39;&lt;p&gt;Sacr\xe9 bleu!&lt;/p&gt;&#39;</span>

<span class="n">soup</span><span class="o">.</span><span class="n">p</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&quot;utf-8&quot;</span><span class="p">)</span>
<span class="c"># &#39;&lt;p&gt;Sacr\xc3\xa9 bleu!&lt;/p&gt;&#39;</span>
</pre></div>
</div>
<p>あなたが選んだ文字コードでは表せない文字は、XMLエンティティリファレンスの数字に変換されます。
次の例は、スノーマンのユニコード文字を含んだドキュメントです。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">markup</span> <span class="o">=</span> <span class="s">u&quot;&lt;b&gt;</span><span class="se">\N{SNOWMAN}</span><span class="s">&lt;/b&gt;&quot;</span>
<span class="n">snowman_soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">markup</span><span class="p">)</span>
<span class="n">tag</span> <span class="o">=</span> <span class="n">snowman_soup</span><span class="o">.</span><span class="n">b</span>
</pre></div>
</div>
<p>スノーマンの文字はUTF-8のドキュメントに組み込めます。(それは☃と表示されます。しかし、ISO-Latin-1やASCIIにはその文字がありません。そこで、これらの文字コードでは&#8221;&amp;#9731&#8221;に変換されます。):</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">print</span><span class="p">(</span><span class="n">tag</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&quot;utf-8&quot;</span><span class="p">))</span>
<span class="c"># &lt;b&gt;☃&lt;/b&gt;</span>

<span class="k">print</span> <span class="n">tag</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&quot;latin-1&quot;</span><span class="p">)</span>
<span class="c"># &lt;b&gt;&amp;#9731;&lt;/b&gt;</span>

<span class="k">print</span> <span class="n">tag</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&quot;ascii&quot;</span><span class="p">)</span>
<span class="c"># &lt;b&gt;&amp;#9731;&lt;/b&gt;</span>
</pre></div>
</div>
</div>
<div class="section" id="unicode-dammit">
<h2>Unicode, Dammit<a class="headerlink" href="#unicode-dammit" title="Permalink to this headline">¶</a></h2>
<p>Beautiful Soup 抜きで、Unicode, Dammitを使えます。
文字コードがわからないデータを持つときや、Unicodeにそのデータを変換したいときは、それは便利です。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">bs4</span> <span class="kn">import</span> <span class="n">UnicodeDammit</span>
<span class="n">dammit</span> <span class="o">=</span> <span class="n">UnicodeDammit</span><span class="p">(</span><span class="s">&quot;Sacr</span><span class="se">\xc3\xa9</span><span class="s"> bleu!&quot;</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">dammit</span><span class="o">.</span><span class="n">unicode_markup</span><span class="p">)</span>
<span class="c"># Sacré bleu!</span>
<span class="n">dammit</span><span class="o">.</span><span class="n">original_encoding</span>
<span class="c"># &#39;utf-8&#39;</span>
</pre></div>
</div>
<p>Pythonライブラリ <tt class="docutils literal"><span class="pre">chardet</span></tt> か <tt class="docutils literal"><span class="pre">cchardet</span></tt> をインストールしていれば、Unicode, Dammitはさらに正確に文字コードを推測できます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">dammit</span> <span class="o">=</span> <span class="n">UnicodeDammit</span><span class="p">(</span><span class="s">&quot;Sacr</span><span class="se">\xe9</span><span class="s"> bleu!&quot;</span><span class="p">,</span> <span class="p">[</span><span class="s">&quot;latin-1&quot;</span><span class="p">,</span> <span class="s">&quot;iso-8859-1&quot;</span><span class="p">])</span>
<span class="k">print</span><span class="p">(</span><span class="n">dammit</span><span class="o">.</span><span class="n">unicode_markup</span><span class="p">)</span>
<span class="c"># Sacré bleu!</span>
<span class="n">dammit</span><span class="o">.</span><span class="n">original_encoding</span>
<span class="c"># &#39;latin-1&#39;</span>
</pre></div>
</div>
<p>Unicode, Dammitには、Beautiful Soupが使わない2つの機能があります。</p>
<div class="section" id="id50">
<h3>スマート引用符<a class="headerlink" href="#id50" title="Permalink to this headline">¶</a></h3>
<p>(訳注: スマート引用符とは、引用符&#8217;で左右の向き(open/close)が区別されているもののことです。
ASCIIコードやシフトJISの引用符は区別されていません。
[ <a class="reference external" href="http://www.nikkeibp.co.jp/article/nba/20100517/226165/">参考リンク</a> ])</p>
<p>Unicode, Dammitは Microsoftスマート引用符を、HTMLやXMLのエンティティに変換します。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">markup</span> <span class="o">=</span> <span class="n">b</span><span class="s">&quot;&lt;p&gt;I just </span><span class="se">\x93</span><span class="s">love</span><span class="se">\x94</span><span class="s"> Microsoft Word</span><span class="se">\x92</span><span class="s">s smart quotes&lt;/p&gt;&quot;</span>

<span class="n">UnicodeDammit</span><span class="p">(</span><span class="n">markup</span><span class="p">,</span> <span class="p">[</span><span class="s">&quot;windows-1252&quot;</span><span class="p">],</span> <span class="n">smart_quotes_to</span><span class="o">=</span><span class="s">&quot;html&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">unicode_markup</span>
<span class="c"># u&#39;&lt;p&gt;I just &amp;ldquo;love&amp;rdquo; Microsoft Word&amp;rsquo;s smart quotes&lt;/p&gt;&#39;</span>

<span class="n">UnicodeDammit</span><span class="p">(</span><span class="n">markup</span><span class="p">,</span> <span class="p">[</span><span class="s">&quot;windows-1252&quot;</span><span class="p">],</span> <span class="n">smart_quotes_to</span><span class="o">=</span><span class="s">&quot;xml&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">unicode_markup</span>
<span class="c"># u&#39;&lt;p&gt;I just &amp;#x201C;love&amp;#x201D; Microsoft Word&amp;#x2019;s smart quotes&lt;/p&gt;&#39;</span>
</pre></div>
</div>
<p>Microsoftスマート引用符をASCII引用符に変換できます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">UnicodeDammit</span><span class="p">(</span><span class="n">markup</span><span class="p">,</span> <span class="p">[</span><span class="s">&quot;windows-1252&quot;</span><span class="p">],</span> <span class="n">smart_quotes_to</span><span class="o">=</span><span class="s">&quot;ascii&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">unicode_markup</span>
<span class="c"># u&#39;&lt;p&gt;I just &quot;love&quot; Microsoft Word\&#39;s smart quotes&lt;/p&gt;&#39;</span>
</pre></div>
</div>
<p>できればこの機能を便利に使ってほしいですが、Beautiful Soupはそれを使いません。
Beautiful Soupは、他の文字と同じように、Microsoftスマート引用符をUnicodeキャラクタに変換するという、デフォルトの振るまいを選びます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">UnicodeDammit</span><span class="p">(</span><span class="n">markup</span><span class="p">,</span> <span class="p">[</span><span class="s">&quot;windows-1252&quot;</span><span class="p">])</span><span class="o">.</span><span class="n">unicode_markup</span>
<span class="c"># u&#39;&lt;p&gt;I just \u201clove\u201d Microsoft Word\u2019s smart quotes&lt;/p&gt;&#39;</span>
</pre></div>
</div>
</div>
<div class="section" id="id52">
<h3>複数の文字コード<a class="headerlink" href="#id52" title="Permalink to this headline">¶</a></h3>
<p>ときどき、ほぼUTF-8で書かれているが、一部Microsoftスマート引用符のような文字コードがWindows-1252の文字を含むドキュメントがあります。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">snowmen</span> <span class="o">=</span> <span class="p">(</span><span class="s">u&quot;</span><span class="se">\N{SNOWMAN}</span><span class="s">&quot;</span> <span class="o">*</span> <span class="mi">3</span><span class="p">)</span>
<span class="n">quote</span> <span class="o">=</span> <span class="p">(</span><span class="s">u&quot;</span><span class="se">\N{LEFT DOUBLE QUOTATION MARK}</span><span class="s">I like snowmen!</span><span class="se">\N{RIGHT DOUBLE QUOTATION MARK}</span><span class="s">&quot;</span><span class="p">)</span>
<span class="n">doc</span> <span class="o">=</span> <span class="n">snowmen</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&quot;utf8&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="n">quote</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&quot;windows_1252&quot;</span><span class="p">)</span>
</pre></div>
</div>
<p>このドキュメントは扱いに困ります。
スノーマンはUTF-8ですが、スマート引用符はWindows-1252です。
スノーマンか引用符のどちらかしか表示できません。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">print</span><span class="p">(</span><span class="n">doc</span><span class="p">)</span>
<span class="c"># ☃☃☃�I like snowmen!�</span>

<span class="k">print</span><span class="p">(</span><span class="n">doc</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s">&quot;windows-1252&quot;</span><span class="p">))</span>
<span class="c"># ☃☃☃“I like snowmen!”</span>
</pre></div>
</div>
<p>ドキュメントをUTF-8としてデコードすると、 <tt class="docutils literal"><span class="pre">UnicodeDecodeError</span></tt> が発生し、Windows-1252でデコードすると意味不明(gibberish?)なことになります。
幸いなことに、 <tt class="docutils literal"><span class="pre">UnicodeDammit.detwingle()</span></tt> はその文字をpure UTF-8に変換し、それをUnicodeにデコードし、スノーマンと引用符を並べて表示することを許可します。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">new_doc</span> <span class="o">=</span> <span class="n">UnicodeDammit</span><span class="o">.</span><span class="n">detwingle</span><span class="p">(</span><span class="n">doc</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">new_doc</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s">&quot;utf8&quot;</span><span class="p">))</span>
<span class="c"># ☃☃☃“I like snowmen!”</span>
</pre></div>
</div>
<p><tt class="docutils literal"><span class="pre">UnicodeDammit.detwingle()</span></tt> UTF-8に埋め込まれたWindows-1252の文字を扱う方法(とその逆)のみを知っています。しかしこれは、よくあるケースではありません。</p>
<p>データを <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> や <tt class="docutils literal"><span class="pre">UnicodeDammit</span></tt> コンストラクタに渡す前に、 <tt class="docutils literal"><span class="pre">UnicodeDammit.detwingle()</span></tt> をコールしなければならないことに注意してください。
Beautiful Soupは 何らかの単一の文字コードでドキュメントが記されていると想定しています。
もし、UTF-8とWindows-1252の両方を含むドキュメントを渡したら、ドキュメント全体がWindows-1252と判断しがちです。そして、そしてそのドキュメントの出力は、 ` テ「ヒ愴津「ヒ愴津「ヒ愴停廬 like snowmen!窶拜` のようになります。</p>
<p><tt class="docutils literal"><span class="pre">UnicodeDammit.detwingle()</span></tt> はBeautiful Soup 4.1.0からの機能です。</p>
</div>
</div>
</div>
<div class="section" id="id53">
<h1>ドキュメントの一部をパース<a class="headerlink" href="#id53" title="Permalink to this headline">¶</a></h1>
<p>あるドキュメントの&lt;a&gt;タグに対してBeautiful Soupを使いたい場合、ドキュメント全部をパースして、その中から&lt;a&gt;タグを探すのは、時間とメモリの無駄です。
最初にでてくる&lt;a&gt;タグ以外を全て無視すれば、処理は速くなります。
<tt class="docutils literal"><span class="pre">SoupStrainer</span></tt> クラスは、与えられたドキュメントのどの部分をパースするかを選ぶことができます。
そのためには、 <tt class="docutils literal"><span class="pre">SoupStrainer</span></tt> を作成し、それを <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> コンストラクタに <tt class="docutils literal"><span class="pre">parse_only</span></tt> 属性として渡すだけです。</p>
<p>(この機能はhtml5libパーサーを使っているときは、使えないことにご注意ください。
もしhtml5libを使うときはどんなときでも、ドキュメント全体がパースされます。
これは、html5libがパースツリーをそのように継続的に再構築するためです。
もし、ドキュメントの一部がパースツリーに組み込まれてない場合は、それは裏ッシュします。
それをさけるためには、例において、Beautiful SoupがPythonの組み込みパーサーを利用させてください)</p>
<div class="section" id="soupstrainer">
<h2><tt class="docutils literal"><span class="pre">SoupStrainer</span></tt><a class="headerlink" href="#soupstrainer" title="Permalink to this headline">¶</a></h2>
<p><tt class="docutils literal"><span class="pre">SoupStrainer</span></tt> (スープ漉し器)クラスは、 <a class="reference internal" href="#id25">パースツリーを検索</a>: するときの典型的なメソッドである <a class="reference internal" href="#name"><em>name</em></a>, <a class="reference internal" href="#attrs"><em>attrs</em></a>, <a class="reference internal" href="#text"><em>text</em></a>, and <a class="reference internal" href="#kwargs"><em>**kwargs</em></a> をもちます。
以下は、 <tt class="docutils literal"><span class="pre">SoupStrainer</span></tt> オブジェクトの3通りの例です。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">bs4</span> <span class="kn">import</span> <span class="n">SoupStrainer</span>

<span class="n">only_a_tags</span> <span class="o">=</span> <span class="n">SoupStrainer</span><span class="p">(</span><span class="s">&quot;a&quot;</span><span class="p">)</span>

<span class="n">only_tags_with_id_link2</span> <span class="o">=</span> <span class="n">SoupStrainer</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="s">&quot;link2&quot;</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">is_short_string</span><span class="p">(</span><span class="n">string</span><span class="p">):</span>
    <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="n">string</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">10</span>

<span class="n">only_short_strings</span> <span class="o">=</span> <span class="n">SoupStrainer</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="n">is_short_string</span><span class="p">)</span>
</pre></div>
</div>
<p>ここで、&#8221;three sisters&#8221;ドキュメントをもう一回とりあげます。
ドキュメントを <tt class="docutils literal"><span class="pre">SoupStrainer</span></tt> オブジェクトで3通りにパースするので、どうなるかを見てみましょう。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">html_doc</span> <span class="o">=</span> <span class="s">&quot;&quot;&quot;</span>
<span class="s">&lt;html&gt;&lt;head&gt;&lt;title&gt;The Dormouse&#39;s story&lt;/title&gt;&lt;/head&gt;</span>

<span class="s">&lt;p class=&quot;title&quot;&gt;&lt;b&gt;The Dormouse&#39;s story&lt;/b&gt;&lt;/p&gt;</span>

<span class="s">&lt;p class=&quot;story&quot;&gt;Once upon a time there were three little sisters; and their names were</span>
<span class="s">&lt;a href=&quot;http://example.com/elsie&quot; class=&quot;sister&quot; id=&quot;link1&quot;&gt;Elsie&lt;/a&gt;,</span>
<span class="s">&lt;a href=&quot;http://example.com/lacie&quot; class=&quot;sister&quot; id=&quot;link2&quot;&gt;Lacie&lt;/a&gt; and</span>
<span class="s">&lt;a href=&quot;http://example.com/tillie&quot; class=&quot;sister&quot; id=&quot;link3&quot;&gt;Tillie&lt;/a&gt;;</span>
<span class="s">and they lived at the bottom of a well.&lt;/p&gt;</span>

<span class="s">&lt;p class=&quot;story&quot;&gt;...&lt;/p&gt;</span>
<span class="s">&quot;&quot;&quot;</span>

<span class="k">print</span><span class="p">(</span><span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">html_doc</span><span class="p">,</span> <span class="s">&quot;html.parser&quot;</span><span class="p">,</span> <span class="n">parse_only</span><span class="o">=</span><span class="n">only_a_tags</span><span class="p">)</span><span class="o">.</span><span class="n">prettify</span><span class="p">())</span>
<span class="c"># &lt;a class=&quot;sister&quot; href=&quot;http://example.com/elsie&quot; id=&quot;link1&quot;&gt;</span>
<span class="c">#  Elsie</span>
<span class="c"># &lt;/a&gt;</span>
<span class="c"># &lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot; id=&quot;link2&quot;&gt;</span>
<span class="c">#  Lacie</span>
<span class="c"># &lt;/a&gt;</span>
<span class="c"># &lt;a class=&quot;sister&quot; href=&quot;http://example.com/tillie&quot; id=&quot;link3&quot;&gt;</span>
<span class="c">#  Tillie</span>
<span class="c"># &lt;/a&gt;</span>

<span class="k">print</span><span class="p">(</span><span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">html_doc</span><span class="p">,</span> <span class="s">&quot;html.parser&quot;</span><span class="p">,</span> <span class="n">parse_only</span><span class="o">=</span><span class="n">only_tags_with_id_link2</span><span class="p">)</span><span class="o">.</span><span class="n">prettify</span><span class="p">())</span>
<span class="c"># &lt;a class=&quot;sister&quot; href=&quot;http://example.com/lacie&quot; id=&quot;link2&quot;&gt;</span>
<span class="c">#  Lacie</span>
<span class="c"># &lt;/a&gt;</span>

<span class="k">print</span><span class="p">(</span><span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">html_doc</span><span class="p">,</span> <span class="s">&quot;html.parser&quot;</span><span class="p">,</span> <span class="n">parse_only</span><span class="o">=</span><span class="n">only_short_strings</span><span class="p">)</span><span class="o">.</span><span class="n">prettify</span><span class="p">())</span>
<span class="c"># Elsie</span>
<span class="c"># ,</span>
<span class="c"># Lacie</span>
<span class="c"># and</span>
<span class="c"># Tillie</span>
<span class="c"># ...</span>
<span class="c">#</span>
</pre></div>
</div>
<p><tt class="docutils literal"><span class="pre">SoupStrainer</span></tt> <a class="reference internal" href="#id25">パースツリーを検索</a> のメソッドに渡すことができます。
これは、とても便利です。少しだけ説明します。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">html_doc</span><span class="p">)</span>
<span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">only_short_strings</span><span class="p">)</span>
<span class="c"># [u&#39;\n\n&#39;, u&#39;\n\n&#39;, u&#39;Elsie&#39;, u&#39;,\n&#39;, u&#39;Lacie&#39;, u&#39; and\n&#39;, u&#39;Tillie&#39;,</span>
<span class="c">#  u&#39;\n\n&#39;, u&#39;...&#39;, u&#39;\n&#39;]</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="id54">
<h1>トラブルシューティング<a class="headerlink" href="#id54" title="Permalink to this headline">¶</a></h1>
<div class="section" id="diagnose">
<span id="id55"></span><h2><tt class="docutils literal"><span class="pre">diagnose()</span></tt><a class="headerlink" href="#diagnose" title="Permalink to this headline">¶</a></h2>
<p>もし、Beautiful Soupがドキュメントに何かをしてトラブルになっているときは、どのドキュメントを <tt class="docutils literal"><span class="pre">diagnose()</span></tt> 関数に渡してみてください。(これはBeautiful Soup 4.2.0の新機能です)
Beautiful Soupは、どのようにパーサーがそのドキュメントを扱ったかというレポートを出力し、BeautifulSoupが使っているパーサーが失っているかどうかを教えてくれます。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">bs4.diagnose</span> <span class="kn">import</span> <span class="n">diagnose</span>
<span class="n">data</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s">&quot;bad.html&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="n">diagnose</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>

<span class="c"># Diagnostic running on Beautiful Soup 4.2.0</span>
<span class="c"># Python version 2.7.3 (default, Aug  1 2012, 05:16:07)</span>
<span class="c"># I noticed that html5lib is not installed. Installing it may help.</span>
<span class="c"># Found lxml version 2.3.2.0</span>
<span class="c">#</span>
<span class="c"># Trying to parse your data with html.parser</span>
<span class="c"># Here&#39;s what html.parser did with the document:</span>
<span class="c"># ...</span>
</pre></div>
</div>
<p>diagnose()の出力をみてみると、どのように問題を解決すればよいかわかるでしょう。もし、わからなくても、助けをもとめるときに、 <tt class="docutils literal"><span class="pre">diagnose()</span></tt> の出力を貼り付けることができます。</p>
</div>
<div class="section" id="id56">
<h2>パース時に出るエラー<a class="headerlink" href="#id56" title="Permalink to this headline">¶</a></h2>
<p>パースエラーには2種類あります。
1つは、クラッシュです。Beautifuls Soupにドキュメントを読み込ませたときに、例外が発生します。たいていそれは <tt class="docutils literal"><span class="pre">HTMLParser.HTMPParserError</span></tt> です。
もう1つは、想定外の動作です。Beautiful Soupのパースツリーが、元のドキュメントのパースツリーとかなり違うことがあります。</p>
<p>これらのエラーは、たいていBeautiful Soupが原因ではありません。そのように言えるのは、Beautiful Soupがよくできたソフトウェアだからではなく、Beautiful Soupがパース処理のコードを含んでいないためです。
代わりに、Beautiful Soupは外部のパーサーに頼っています。もしあるパーサーが正しいドキュメントをパースできないときは、他のパーサーを試してみるというのが一番良い対処です。
<a class="reference internal" href="#id10">パーサーのインストール</a> に、これについての詳細とパーサーの比較が載っています。</p>
<p>一番よくみるパースエラーは、 <tt class="docutils literal"><span class="pre">HTMLParser.HTMLParseError:</span> <span class="pre">malformed</span> <span class="pre">start</span> <span class="pre">tag</span></tt> と
<tt class="docutils literal"><span class="pre">HTMLParser.HTMLPraseError:</span> <span class="pre">bad</span> <span class="pre">end</span> <span class="pre">tag</span></tt> でしょう。
これらはともに、Python組み込みのHTMLパーサーライブラリが返します。
この場合は、 <a class="reference internal" href="#parser-installation"><em>lxml か html5lib をインストール</em></a> するとよいです。</p>
<p>想定外の動作のエラーで最も多いのは、あると思っていたタグを見つけられないときです。
見たことあると思いますが、そのとき <tt class="docutils literal"><span class="pre">find_all()</span></tt> は <tt class="docutils literal"><span class="pre">[]</span></tt> を返し、 <tt class="docutils literal"><span class="pre">find()</span></tt> は <tt class="docutils literal"><span class="pre">None</span></tt> を返します。
これも、Python組み込みHTMLパーサーにとっては、よくある問題です。やはり、一番よい対処は、 <a class="reference internal" href="#parser-installation"><em>lxml か html5lib をインストール</em></a> することです。</p>
</div>
<div class="section" id="id57">
<h2>バージョン違いの問題<a class="headerlink" href="#id57" title="Permalink to this headline">¶</a></h2>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">SyntaxError:</span> <span class="pre">Invalid</span> <span class="pre">syntax</span></tt> (on the line <tt class="docutils literal"><span class="pre">ROOT_TAG_NAME</span> <span class="pre">=</span>
<span class="pre">u'[document]'</span></tt>): Python 2バージョンのBeautiful Soupを、変換しないでPython 3で実行したためです。</li>
</ul>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">ImportError:</span> <span class="pre">No</span> <span class="pre">module</span> <span class="pre">named</span> <span class="pre">HTMLParser</span></tt> - Python 2バージョンのBeautiful Soupを、Python 3で実行したためです。</li>
</ul>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">ImportError:</span> <span class="pre">No</span> <span class="pre">module</span> <span class="pre">named</span> <span class="pre">html.parser</span></tt> - Python 3バージョンのBeautiful Soupを、Python 2で実行したためです。</li>
</ul>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">ImportError:</span> <span class="pre">No</span> <span class="pre">module</span> <span class="pre">named</span> <span class="pre">BeautifulSoup</span></tt> - Beautiful Soup 3のコードを、BS3がインストールされてない環境で実行したため、またはBeautiful Soup 4のコードをパッケージ名を <tt class="docutils literal"><span class="pre">bs4</span></tt> に変えずに実行したためです。</li>
</ul>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">ImportError:</span> <span class="pre">No</span> <span class="pre">module</span> <span class="pre">named</span> <span class="pre">bs4</span></tt> - Beautiful Soup 4のコードを、BS4がインストールされてない環境で実行したためです。</li>
</ul>
<span class="target" id="parsing-xml"></span></div>
<div class="section" id="xml">
<h2>XMLのパース<a class="headerlink" href="#xml" title="Permalink to this headline">¶</a></h2>
<p>デフォルトでは、Beautiful SoupはドキュメントをHTMLとしてパースします。XMLとしてパースするには、 <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> コンストラクタの第二引数に、 &#8220;xml&#8221; を渡します。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">markup</span><span class="p">,</span> <span class="s">&quot;xml&quot;</span><span class="p">)</span>
</pre></div>
</div>
<p>このためには、 <a class="reference internal" href="#parser-installation"><em>lxml をインストール</em></a> している必要があります。</p>
</div>
<div class="section" id="id58">
<h2>その他のパーサーの問題<a class="headerlink" href="#id58" title="Permalink to this headline">¶</a></h2>
<ul class="simple">
<li>If your script works on one computer but not another, it&#8217;s probably
because the two computers have different parser libraries
available. For example, you may have developed the script on a
computer that has lxml installed, and then tried to run it on a
computer that only has html5lib installed. See <a class="reference internal" href="#id47">パーサーの違い</a>
for why this matters, and fix the problem by mentioning a
specific parser library in the <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> constructor.</li>
<li>Because <a class="reference external" href="http://www.w3.org/TR/html5/syntax.html#syntax">HTML tags and attributes are case-insensitive</a>, all three HTML
parsers convert tag and attribute names to lowercase. That is, the
markup &lt;TAG&gt;&lt;/TAG&gt; is converted to &lt;tag&gt;&lt;/tag&gt;. If you want to
preserve mixed-case or uppercase tags and attributes, you&#8217;ll need to
<a class="reference internal" href="#parsing-xml"><em>parse the document as XML.</em></a></li>
</ul>
</div>
<div class="section" id="misc">
<span id="id59"></span><h2>その他<a class="headerlink" href="#misc" title="Permalink to this headline">¶</a></h2>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">UnicodeEncodeError:</span> <span class="pre">'charmap'</span> <span class="pre">codec</span> <span class="pre">can't</span> <span class="pre">encode</span> <span class="pre">character</span>
<span class="pre">u'\xfoo'</span> <span class="pre">in</span> <span class="pre">position</span> <span class="pre">bar</span></tt> (or just about any other
<tt class="docutils literal"><span class="pre">UnicodeEncodeError</span></tt>) - This is not a problem with Beautiful Soup.
This problem shows up in two main situations. First, when you try to
print a Unicode character that your console doesn&#8217;t know how to
display. (See <a class="reference external" href="http://wiki.python.org/moin/PrintFails">this page on the Python wiki</a> for help.) Second, when
you&#8217;re writing to a file and you pass in a Unicode character that&#8217;s
not supported by your default encoding.  In this case, the simplest
solution is to explicitly encode the Unicode string into UTF-8 with
<tt class="docutils literal"><span class="pre">u.encode(&quot;utf8&quot;)</span></tt>.</li>
<li><tt class="docutils literal"><span class="pre">KeyError:</span> <span class="pre">[attr]</span></tt> - Caused by accessing <tt class="docutils literal"><span class="pre">tag['attr']</span></tt> when the
tag in question doesn&#8217;t define the <tt class="docutils literal"><span class="pre">attr</span></tt> attribute. The most
common errors are <tt class="docutils literal"><span class="pre">KeyError:</span> <span class="pre">'href'</span></tt> and <tt class="docutils literal"><span class="pre">KeyError:</span>
<span class="pre">'class'</span></tt>. Use <tt class="docutils literal"><span class="pre">tag.get('attr')</span></tt> if you&#8217;re not sure <tt class="docutils literal"><span class="pre">attr</span></tt> is
defined, just as you would with a Python dictionary.</li>
<li><tt class="docutils literal"><span class="pre">AttributeError:</span> <span class="pre">'ResultSet'</span> <span class="pre">object</span> <span class="pre">has</span> <span class="pre">no</span> <span class="pre">attribute</span> <span class="pre">'foo'</span></tt> - This
usually happens because you expected <tt class="docutils literal"><span class="pre">find_all()</span></tt> to return a
single tag or string. But <tt class="docutils literal"><span class="pre">find_all()</span></tt> returns a _list_ of tags
and strings&#8211;a <tt class="docutils literal"><span class="pre">ResultSet</span></tt> object. You need to iterate over the
list and look at the <tt class="docutils literal"><span class="pre">.foo</span></tt> of each one. Or, if you really only
want one result, you need to use <tt class="docutils literal"><span class="pre">find()</span></tt> instead of
<tt class="docutils literal"><span class="pre">find_all()</span></tt>.</li>
<li><tt class="docutils literal"><span class="pre">AttributeError:</span> <span class="pre">'NoneType'</span> <span class="pre">object</span> <span class="pre">has</span> <span class="pre">no</span> <span class="pre">attribute</span> <span class="pre">'foo'</span></tt> - This
usually happens because you called <tt class="docutils literal"><span class="pre">find()</span></tt> and then tried to
access the <cite>.foo`</cite> attribute of the result. But in your case,
<tt class="docutils literal"><span class="pre">find()</span></tt> didn&#8217;t find anything, so it returned <tt class="docutils literal"><span class="pre">None</span></tt>, instead of
returning a tag or a string. You need to figure out why your
<tt class="docutils literal"><span class="pre">find()</span></tt> call isn&#8217;t returning anything.</li>
</ul>
</div>
<div class="section" id="id60">
<h2>パフォーマンス改善<a class="headerlink" href="#id60" title="Permalink to this headline">¶</a></h2>
<p>Beautiful Soup will never be as fast as the parsers it sits on top
of. If response time is critical, if you&#8217;re paying for computer time
by the hour, or if there&#8217;s any other reason why computer time is more
valuable than programmer time, you should forget about Beautiful Soup
and work directly atop <a class="reference external" href="http://lxml.de/">lxml</a>.</p>
<p>That said, there are things you can do to speed up Beautiful Soup. If
you&#8217;re not using lxml as the underlying parser, my advice is to
<a class="reference internal" href="#parser-installation"><em>start</em></a>. Beautiful Soup parses documents
significantly faster using lxml than using html.parser or html5lib.</p>
<p>You can speed up encoding detection significantly by installing the
<a class="reference external" href="http://pypi.python.org/pypi/cchardet/">cchardet</a> library.</p>
<p><a class="reference internal" href="#id53">ドキュメントの一部をパース</a> won&#8217;t save you much time parsing
the document, but it can save a lot of memory, and it&#8217;ll make
<cite>searching</cite> the document much faster.</p>
</div>
</div>
<div class="section" id="beautiful-soup-3">
<h1>Beautiful Soup 3<a class="headerlink" href="#beautiful-soup-3" title="Permalink to this headline">¶</a></h1>
<p>Beautiful Soup 3は一つ前のリリースで、すでに開発は停止しています。
現在でも、全ての主なLinuxディストリビューションに含まれています。:</p>
<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">apt-get</span> <span class="pre">install</span> <span class="pre">python-beautifulsoup</span></tt></p>
<p>Pypiでも <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> として利用できます。</p>
<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">easy_install</span> <span class="pre">BeautifulSoup</span></tt></p>
<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">pip</span> <span class="pre">install</span> <span class="pre">BeautifulSoup</span></tt></p>
<p>次のリンクからダウンロードできます。<a class="reference external" href="http://www.crummy.com/software/BeautifulSoup/bs3/download/3.x/BeautifulSoup-3.2.0.tar.gz">tarball of Beautiful Soup 3.2.0</a>.</p>
<p><tt class="docutils literal"><span class="pre">easy_install</span> <span class="pre">beautifulsoup</span></tt> , <tt class="docutils literal"><span class="pre">easy_install</span> <span class="pre">BeautifulSoup</span></tt> というコマンドでBeautiful Soupをインストールすると、あなたのコードは動きません。 <tt class="docutils literal"><span class="pre">easy_install</span> <span class="pre">beautifulsoup4</span></tt> と入力しましょう。</p>
<p><a class="reference external" href="http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html">Beautiful Soup 3 のドキュメントはアーカイブされています。</a></p>
<p>日本語版は次のリンクから参照できます。 <a class="reference external" href="http://tdoc.info/beautifulsoup/">Beautiful Soup ドキュメント</a>
Beautiful Soup 4での変更点が理解するために、これらのドキュメントを読んでみてください。</p>
<div class="section" id="bs4">
<h2>BS4への移行<a class="headerlink" href="#bs4" title="Permalink to this headline">¶</a></h2>
<p>多くのBS3で書かれたコードは、一か所変更するだけでBS4で動きます。パッケージ名を <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> から <tt class="docutils literal"><span class="pre">bs4</span></tt> に変更するだけです。これを、、:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">BeautifulSoup</span> <span class="kn">import</span> <span class="n">BeautifulSoup</span>
</pre></div>
</div>
<p>以下のようにします。:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">bs4</span> <span class="kn">import</span> <span class="n">BeautifulSoup</span>
</pre></div>
</div>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">ImportError</span></tt> &#8220;No module named BeautifulSoup&#8221; が表示された場合、BS4しかインストールされていないのに、BS3のコードを実行しようとしたのが問題です。</li>
</ul>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">ImportError</span></tt> &#8220;No module named bs4&#8221; が表示された場合、BS3しかインストールされていないのに、BS4のコードを実行しようとしたのが問題です。</li>
</ul>
<p>BS4はBS3の大部分について後方互換性がありますが、それらのメソッドのほとんどは変更され`PEP 8 規約 &lt;<a class="reference external" href="http://www.python.org/dev/peps/pep-0008/">http://www.python.org/dev/peps/pep-0008/</a>&gt;`_ に沿った新しい名前になっています。多くの名前等の変更により、後方互換性の一部が損なわれています。</p>
<p>以下は、BS3のコードをBS4に変換するのに知っておくべき事項です。:</p>
<div class="section" id="id63">
<h3>パーサー<a class="headerlink" href="#id63" title="Permalink to this headline">¶</a></h3>
<p>Beautiful Soup 3 used Python&#8217;s <tt class="docutils literal"><span class="pre">SGMLParser</span></tt>, a module that was
deprecated and removed in Python 3.0. Beautiful Soup 4 uses
<tt class="docutils literal"><span class="pre">html.parser</span></tt> by default, but you can plug in lxml or html5lib and
use that instead. See <a class="reference internal" href="#id10">パーサーのインストール</a> for a comparison.</p>
<p>Since <tt class="docutils literal"><span class="pre">html.parser</span></tt> is not the same parser as <tt class="docutils literal"><span class="pre">SGMLParser</span></tt>, it
will treat invalid markup differently. Usually the &#8220;difference&#8221; is
that <tt class="docutils literal"><span class="pre">html.parser</span></tt> crashes. In that case, you&#8217;ll need to install
another parser. But sometimes <tt class="docutils literal"><span class="pre">html.parser</span></tt> just creates a different
parse tree than <tt class="docutils literal"><span class="pre">SGMLParser</span></tt> would. If this happens, you may need to
update your BS3 scraping code to deal with the new tree.</p>
</div>
<div class="section" id="id64">
<h3>メソッド名<a class="headerlink" href="#id64" title="Permalink to this headline">¶</a></h3>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">renderContents</span></tt> -&gt; <tt class="docutils literal"><span class="pre">encode_contents</span></tt></li>
<li><tt class="docutils literal"><span class="pre">replaceWith</span></tt> -&gt; <tt class="docutils literal"><span class="pre">replace_with</span></tt></li>
<li><tt class="docutils literal"><span class="pre">replaceWithChildren</span></tt> -&gt; <tt class="docutils literal"><span class="pre">unwrap</span></tt></li>
<li><tt class="docutils literal"><span class="pre">findAll</span></tt> -&gt; <tt class="docutils literal"><span class="pre">find_all</span></tt></li>
<li><tt class="docutils literal"><span class="pre">findAllNext</span></tt> -&gt; <tt class="docutils literal"><span class="pre">find_all_next</span></tt></li>
<li><tt class="docutils literal"><span class="pre">findAllPrevious</span></tt> -&gt; <tt class="docutils literal"><span class="pre">find_all_previous</span></tt></li>
<li><tt class="docutils literal"><span class="pre">findNext</span></tt> -&gt; <tt class="docutils literal"><span class="pre">find_next</span></tt></li>
<li><tt class="docutils literal"><span class="pre">findNextSibling</span></tt> -&gt; <tt class="docutils literal"><span class="pre">find_next_sibling</span></tt></li>
<li><tt class="docutils literal"><span class="pre">findNextSiblings</span></tt> -&gt; <tt class="docutils literal"><span class="pre">find_next_siblings</span></tt></li>
<li><tt class="docutils literal"><span class="pre">findParent</span></tt> -&gt; <tt class="docutils literal"><span class="pre">find_parent</span></tt></li>
<li><tt class="docutils literal"><span class="pre">findParents</span></tt> -&gt; <tt class="docutils literal"><span class="pre">find_parents</span></tt></li>
<li><tt class="docutils literal"><span class="pre">findPrevious</span></tt> -&gt; <tt class="docutils literal"><span class="pre">find_previous</span></tt></li>
<li><tt class="docutils literal"><span class="pre">findPreviousSibling</span></tt> -&gt; <tt class="docutils literal"><span class="pre">find_previous_sibling</span></tt></li>
<li><tt class="docutils literal"><span class="pre">findPreviousSiblings</span></tt> -&gt; <tt class="docutils literal"><span class="pre">find_previous_siblings</span></tt></li>
<li><tt class="docutils literal"><span class="pre">nextSibling</span></tt> -&gt; <tt class="docutils literal"><span class="pre">next_sibling</span></tt></li>
<li><tt class="docutils literal"><span class="pre">previousSibling</span></tt> -&gt; <tt class="docutils literal"><span class="pre">previous_sibling</span></tt></li>
</ul>
<p>Some arguments to the Beautiful Soup constructor were renamed for the
same reasons:</p>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">BeautifulSoup(parseOnlyThese=...)</span></tt> -&gt; <tt class="docutils literal"><span class="pre">BeautifulSoup(parse_only=...)</span></tt></li>
<li><tt class="docutils literal"><span class="pre">BeautifulSoup(fromEncoding=...)</span></tt> -&gt; <tt class="docutils literal"><span class="pre">BeautifulSoup(from_encoding=...)</span></tt></li>
</ul>
<p>I renamed one method for compatibility with Python 3:</p>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">Tag.has_key()</span></tt> -&gt; <tt class="docutils literal"><span class="pre">Tag.has_attr()</span></tt></li>
</ul>
<p>I renamed one attribute to use more accurate terminology:</p>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">Tag.isSelfClosing</span></tt> -&gt; <tt class="docutils literal"><span class="pre">Tag.is_empty_element</span></tt></li>
</ul>
<p>I renamed three attributes to avoid using words that have special
meaning to Python. Unlike the others, these changes are <em>not backwards
compatible.</em> If you used these attributes in BS3, your code will break
on BS4 until you change them.</p>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">UnicodeDammit.unicode</span></tt> -&gt; <tt class="docutils literal"><span class="pre">UnicodeDammit.unicode_markup</span></tt></li>
<li><tt class="docutils literal"><span class="pre">Tag.next</span></tt> -&gt; <tt class="docutils literal"><span class="pre">Tag.next_element</span></tt></li>
<li><tt class="docutils literal"><span class="pre">Tag.previous</span></tt> -&gt; <tt class="docutils literal"><span class="pre">Tag.previous_element</span></tt></li>
</ul>
</div>
<div class="section" id="id65">
<h3>ジェネレーター<a class="headerlink" href="#id65" title="Permalink to this headline">¶</a></h3>
<p>I gave the generators PEP 8-compliant names, and transformed them into
properties:</p>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">childGenerator()</span></tt> -&gt; <tt class="docutils literal"><span class="pre">children</span></tt></li>
<li><tt class="docutils literal"><span class="pre">nextGenerator()</span></tt> -&gt; <tt class="docutils literal"><span class="pre">next_elements</span></tt></li>
<li><tt class="docutils literal"><span class="pre">nextSiblingGenerator()</span></tt> -&gt; <tt class="docutils literal"><span class="pre">next_siblings</span></tt></li>
<li><tt class="docutils literal"><span class="pre">previousGenerator()</span></tt> -&gt; <tt class="docutils literal"><span class="pre">previous_elements</span></tt></li>
<li><tt class="docutils literal"><span class="pre">previousSiblingGenerator()</span></tt> -&gt; <tt class="docutils literal"><span class="pre">previous_siblings</span></tt></li>
<li><tt class="docutils literal"><span class="pre">recursiveChildGenerator()</span></tt> -&gt; <tt class="docutils literal"><span class="pre">descendants</span></tt></li>
<li><tt class="docutils literal"><span class="pre">parentGenerator()</span></tt> -&gt; <tt class="docutils literal"><span class="pre">parents</span></tt></li>
</ul>
<p>So instead of this:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">parent</span> <span class="ow">in</span> <span class="n">tag</span><span class="o">.</span><span class="n">parentGenerator</span><span class="p">():</span>
    <span class="o">...</span>
</pre></div>
</div>
<p>You can write this:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">parent</span> <span class="ow">in</span> <span class="n">tag</span><span class="o">.</span><span class="n">parents</span><span class="p">:</span>
    <span class="o">...</span>
</pre></div>
</div>
<p>(But the old code will still work.)</p>
<p>Some of the generators used to yield <tt class="docutils literal"><span class="pre">None</span></tt> after they were done, and
then stop. That was a bug. Now the generators just stop.</p>
<p>There are two new generators, <a class="reference internal" href="#string-generators"><em>.strings and
.stripped_strings</em></a>. <tt class="docutils literal"><span class="pre">.strings</span></tt> yields
NavigableString objects, and <tt class="docutils literal"><span class="pre">.stripped_strings</span></tt> yields Python
strings that have had whitespace stripped.</p>
</div>
<div class="section" id="id66">
<h3>XML<a class="headerlink" href="#id66" title="Permalink to this headline">¶</a></h3>
<p>There is no longer a <tt class="docutils literal"><span class="pre">BeautifulStoneSoup</span></tt> class for parsing XML. To
parse XML you pass in &#8220;xml&#8221; as the second argument to the
<tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> constructor. For the same reason, the
<tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> constructor no longer recognizes the <tt class="docutils literal"><span class="pre">isHTML</span></tt>
argument.</p>
<p>Beautiful Soup&#8217;s handling of empty-element XML tags has been
improved. Previously when you parsed XML you had to explicitly say
which tags were considered empty-element tags. The <tt class="docutils literal"><span class="pre">selfClosingTags</span></tt>
argument to the constructor is no longer recognized. Instead,
Beautiful Soup considers any empty tag to be an empty-element tag. If
you add a child to an empty-element tag, it stops being an
empty-element tag.</p>
</div>
<div class="section" id="id67">
<h3>エンティティ<a class="headerlink" href="#id67" title="Permalink to this headline">¶</a></h3>
<p>An incoming HTML or XML entity is always converted into the
corresponding Unicode character. Beautiful Soup 3 had a number of
overlapping ways of dealing with entities, which have been
removed. The <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> constructor no longer recognizes the
<tt class="docutils literal"><span class="pre">smartQuotesTo</span></tt> or <tt class="docutils literal"><span class="pre">convertEntities</span></tt> arguments. (<a class="reference internal" href="#unicode-dammit">Unicode,
Dammit</a> still has <tt class="docutils literal"><span class="pre">smart_quotes_to</span></tt>, but its default is now to turn
smart quotes into Unicode.) The constants <tt class="docutils literal"><span class="pre">HTML_ENTITIES</span></tt>,
<tt class="docutils literal"><span class="pre">XML_ENTITIES</span></tt>, and <tt class="docutils literal"><span class="pre">XHTML_ENTITIES</span></tt> have been removed, since they
configure a feature (transforming some but not all entities into
Unicode characters) that no longer exists.</p>
<p>If you want to turn Unicode characters back into HTML entities on
output, rather than turning them into UTF-8 characters, you need to
use an <a class="reference internal" href="#output-formatters"><em>output formatter</em></a>.</p>
</div>
<div class="section" id="id68">
<h3>その他<a class="headerlink" href="#id68" title="Permalink to this headline">¶</a></h3>
<p><a class="reference internal" href="#string"><em>Tag.string</em></a> now operates recursively. If tag A
contains a single tag B and nothing else, then A.string is the same as
B.string. (Previously, it was None.)</p>
<p><a class="reference internal" href="#id15">値が複数のとき</a> like <tt class="docutils literal"><span class="pre">class</span></tt> have lists of strings as
their values, not strings. This may affect the way you search by CSS
class.</p>
<p>If you pass one of the <tt class="docutils literal"><span class="pre">find*</span></tt> methods both <a class="reference internal" href="#text"><em>text</em></a> <cite>and</cite>
a tag-specific argument like <a class="reference internal" href="#name"><em>name</em></a>, Beautiful Soup will
search for tags that match your tag-specific criteria and whose
<a class="reference internal" href="#string"><em>Tag.string</em></a> matches your value for <a class="reference internal" href="#text"><em>text</em></a>. It will <cite>not</cite> find the strings themselves. Previously,
Beautiful Soup ignored the tag-specific arguments and looked for
strings.</p>
<p>The <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> constructor no longer recognizes the
<cite>markupMassage</cite> argument. It&#8217;s now the parser&#8217;s responsibility to
handle markup correctly.</p>
<p>The rarely-used alternate parser classes like
<tt class="docutils literal"><span class="pre">ICantBelieveItsBeautifulSoup</span></tt> and <tt class="docutils literal"><span class="pre">BeautifulSOAP</span></tt> have been
removed. It&#8217;s now the parser&#8217;s decision how to handle ambiguous
markup.</p>
<p>The <tt class="docutils literal"><span class="pre">prettify()</span></tt> method now returns a Unicode string, not a bytestring.</p>
</div>
</div>
</div>


          </div>
        </div>
      </div>
      <div class="sphinxsidebar">
        <div class="sphinxsidebarwrapper">
  <h3><a href="#">Table Of Contents</a></h3>
  <ul>
<li><a class="reference internal" href="#">Beautiful Soup</a><ul>
<li><a class="reference internal" href="#id2">(訳注)石鹸は食べられない</a></li>
<li><a class="reference internal" href="#id3">この文書について</a></li>
<li><a class="reference internal" href="#id5">助けてほしいときは</a></li>
</ul>
</li>
<li><a class="reference internal" href="#id7">クイックスタート</a></li>
<li><a class="reference internal" href="#id8">インストール</a><ul>
<li><a class="reference internal" href="#id9">インストール後の問題</a></li>
<li><a class="reference internal" href="#parser-installation">パーサーのインストール</a></li>
</ul>
</li>
<li><a class="reference internal" href="#id11">スープの作成</a></li>
<li><a class="reference internal" href="#id12">4種類のオブジェクト</a><ul>
<li><a class="reference internal" href="#tag-obj">Tag obj.</a><ul>
<li><a class="reference internal" href="#id13">名前</a></li>
<li><a class="reference internal" href="#id14">属性</a><ul>
<li><a class="reference internal" href="#id15">値が複数のとき</a></li>
</ul>
</li>
</ul>
</li>
<li><a class="reference internal" href="#navigablestring-obj">NavigableString obj.</a></li>
<li><a class="reference internal" href="#beautifulsoup-obj">BeautifulSoup obj.</a></li>
<li><a class="reference internal" href="#comments-obj">Comments obj. 他</a></li>
</ul>
</li>
<li><a class="reference internal" href="#id16">パースツリーを探索</a><ul>
<li><a class="reference internal" href="#id17">子要素へ下移動</a><ul>
<li><a class="reference internal" href="#id18">タグ名で探索</a></li>
<li><a class="reference internal" href="#contents-children"><tt class="docutils literal"><span class="pre">.contents</span></tt> / <tt class="docutils literal"><span class="pre">.children</span></tt></a></li>
<li><a class="reference internal" href="#descendants"><tt class="docutils literal"><span class="pre">.descendants</span></tt></a></li>
<li><a class="reference internal" href="#string"><tt class="docutils literal"><span class="pre">.string</span></tt></a></li>
<li><a class="reference internal" href="#strings-stripped-strings"><tt class="docutils literal"><span class="pre">.strings</span></tt> / <tt class="docutils literal"><span class="pre">.stripped_strings</span></tt></a></li>
</ul>
</li>
<li><a class="reference internal" href="#id20">親要素へ上移動</a><ul>
<li><a class="reference internal" href="#parent"><tt class="docutils literal"><span class="pre">.parent</span></tt></a></li>
<li><a class="reference internal" href="#parents"><tt class="docutils literal"><span class="pre">.parents</span></tt></a></li>
</ul>
</li>
<li><a class="reference internal" href="#id23">兄弟要素へ横移動</a><ul>
<li><a class="reference internal" href="#next-sibling-previous-sibling"><tt class="docutils literal"><span class="pre">.next_sibling</span></tt> / <tt class="docutils literal"><span class="pre">.previous_sibling</span></tt></a></li>
<li><a class="reference internal" href="#next-siblings-previous-siblings"><tt class="docutils literal"><span class="pre">.next_siblings</span></tt> / <tt class="docutils literal"><span class="pre">.previous_siblings</span></tt></a></li>
</ul>
</li>
<li><a class="reference internal" href="#id24">前後の要素へ移動</a><ul>
<li><a class="reference internal" href="#next-element-previous-element"><tt class="docutils literal"><span class="pre">.next_element</span></tt> / <tt class="docutils literal"><span class="pre">.previous_element</span></tt></a></li>
<li><a class="reference internal" href="#next-elements-previous-elements"><tt class="docutils literal"><span class="pre">.next_elements</span></tt> / <tt class="docutils literal"><span class="pre">.previous_elements</span></tt></a></li>
</ul>
</li>
</ul>
</li>
<li><a class="reference internal" href="#id25">パースツリーを検索</a><ul>
<li><a class="reference internal" href="#id26">フィルターの種類</a><ul>
<li><a class="reference internal" href="#id27">文字列</a></li>
<li><a class="reference internal" href="#id28">正規表現</a></li>
<li><a class="reference internal" href="#id29">リスト</a></li>
<li><a class="reference internal" href="#true">True値</a></li>
<li><a class="reference internal" href="#id30">関数</a></li>
</ul>
</li>
<li><a class="reference internal" href="#find-all"><tt class="docutils literal"><span class="pre">find_all()</span></tt></a><ul>
<li><a class="reference internal" href="#id31">name引数</a></li>
<li><a class="reference internal" href="#id32">キーワード引数</a></li>
<li><a class="reference internal" href="#css">CSSのクラスで検索</a></li>
<li><a class="reference internal" href="#id33">text引数</a></li>
<li><a class="reference internal" href="#limit">limit引数</a></li>
<li><a class="reference internal" href="#recursive">recursive引数</a></li>
<li><a class="reference internal" href="#id36">ショートカット</a></li>
</ul>
</li>
<li><a class="reference internal" href="#find"><tt class="docutils literal"><span class="pre">find()</span></tt></a></li>
<li><a class="reference internal" href="#find-parents-find-parent"><tt class="docutils literal"><span class="pre">find_parents()</span></tt> / <tt class="docutils literal"><span class="pre">find_parent()</span></tt></a></li>
<li><a class="reference internal" href="#find-next-siblings-find-next-sibling"><tt class="docutils literal"><span class="pre">find_next_siblings()</span></tt> / <tt class="docutils literal"><span class="pre">find_next_sibling()</span></tt></a></li>
<li><a class="reference internal" href="#find-previous-siblings-find-previous-sibling"><tt class="docutils literal"><span class="pre">find_previous_siblings()</span></tt> / <tt class="docutils literal"><span class="pre">find_previous_sibling()</span></tt></a></li>
<li><a class="reference internal" href="#find-all-next-find-next"><tt class="docutils literal"><span class="pre">find_all_next()</span></tt> / <tt class="docutils literal"><span class="pre">find_next()</span></tt></a></li>
<li><a class="reference internal" href="#find-all-previous-find-previous"><tt class="docutils literal"><span class="pre">find_all_previous()</span></tt> / <tt class="docutils literal"><span class="pre">find_previous()</span></tt></a></li>
<li><a class="reference internal" href="#id37">CSSセレクタ</a></li>
</ul>
</li>
<li><a class="reference internal" href="#id38">パースツリーを修正</a><ul>
<li><a class="reference internal" href="#id39">名前や属性の変更</a></li>
<li><a class="reference internal" href="#id40"><tt class="docutils literal"><span class="pre">.string</span></tt> の修正</a></li>
<li><a class="reference internal" href="#append"><tt class="docutils literal"><span class="pre">append()</span></tt></a></li>
<li><a class="reference internal" href="#beautifulsoup-new-string-new-tag"><tt class="docutils literal"><span class="pre">BeautifulSoup.new_string()</span></tt> / <tt class="docutils literal"><span class="pre">.new_tag()</span></tt></a></li>
<li><a class="reference internal" href="#insert"><tt class="docutils literal"><span class="pre">insert()</span></tt></a></li>
<li><a class="reference internal" href="#insert-before-insert-after"><tt class="docutils literal"><span class="pre">insert_before()</span></tt> / <tt class="docutils literal"><span class="pre">insert_after()</span></tt></a></li>
<li><a class="reference internal" href="#clear"><tt class="docutils literal"><span class="pre">clear()</span></tt></a></li>
<li><a class="reference internal" href="#extract"><tt class="docutils literal"><span class="pre">extract()</span></tt></a></li>
<li><a class="reference internal" href="#decompose"><tt class="docutils literal"><span class="pre">decompose()</span></tt></a></li>
<li><a class="reference internal" href="#replace-with"><tt class="docutils literal"><span class="pre">replace_with()</span></tt></a></li>
<li><a class="reference internal" href="#wrap"><tt class="docutils literal"><span class="pre">wrap()</span></tt></a></li>
<li><a class="reference internal" href="#unwrap"><tt class="docutils literal"><span class="pre">unwrap()</span></tt></a></li>
</ul>
</li>
<li><a class="reference internal" href="#id42">出力</a><ul>
<li><a class="reference internal" href="#id43">きれいに出力</a></li>
<li><a class="reference internal" href="#id44">一行に出力</a></li>
<li><a class="reference internal" href="#id45">フォーマットを指定</a></li>
<li><a class="reference internal" href="#get-text"><tt class="docutils literal"><span class="pre">get_text()</span></tt></a></li>
</ul>
</li>
<li><a class="reference internal" href="#id46">パーサーの指定</a><ul>
<li><a class="reference internal" href="#id47">パーサーの違い</a></li>
</ul>
</li>
<li><a class="reference internal" href="#id48">エンコード</a><ul>
<li><a class="reference internal" href="#id49">出力のエンコード</a></li>
<li><a class="reference internal" href="#unicode-dammit">Unicode, Dammit</a><ul>
<li><a class="reference internal" href="#id50">スマート引用符</a></li>
<li><a class="reference internal" href="#id52">複数の文字コード</a></li>
</ul>
</li>
</ul>
</li>
<li><a class="reference internal" href="#id53">ドキュメントの一部をパース</a><ul>
<li><a class="reference internal" href="#soupstrainer"><tt class="docutils literal"><span class="pre">SoupStrainer</span></tt></a></li>
</ul>
</li>
<li><a class="reference internal" href="#id54">トラブルシューティング</a><ul>
<li><a class="reference internal" href="#diagnose"><tt class="docutils literal"><span class="pre">diagnose()</span></tt></a></li>
<li><a class="reference internal" href="#id56">パース時に出るエラー</a></li>
<li><a class="reference internal" href="#id57">バージョン違いの問題</a></li>
<li><a class="reference internal" href="#xml">XMLのパース</a></li>
<li><a class="reference internal" href="#id58">その他のパーサーの問題</a></li>
<li><a class="reference internal" href="#misc">その他</a></li>
<li><a class="reference internal" href="#id60">パフォーマンス改善</a></li>
</ul>
</li>
<li><a class="reference internal" href="#beautiful-soup-3">Beautiful Soup 3</a><ul>
<li><a class="reference internal" href="#bs4">BS4への移行</a><ul>
<li><a class="reference internal" href="#id63">パーサー</a></li>
<li><a class="reference internal" href="#id64">メソッド名</a></li>
<li><a class="reference internal" href="#id65">ジェネレーター</a></li>
<li><a class="reference internal" href="#id66">XML</a></li>
<li><a class="reference internal" href="#id67">エンティティ</a></li>
<li><a class="reference internal" href="#id68">その他</a></li>
</ul>
</li>
</ul>
</li>
</ul>

  <h3>This Page</h3>
  <ul class="this-page-menu">
    <li><a href="_sources/index.txt"
           rel="nofollow">Show Source</a></li>
  </ul>

<div id="searchbox" style="display: none">
  <h3>Quick search</h3>
    <form class="search" action="search.html" method="get">
      <input type="text" name="q" />
      <input type="submit" value="Go" />
      <input type="hidden" name="check_keywords" value="yes" />
      <input type="hidden" name="area" value="default" />
    </form>
    <p class="searchtip" style="font-size: 90%">
    Enter search terms or a module, class or function name.
    </p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>

<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-23795927-33', 'kondou.com');
  ga('send', 'pageview');

</script>


        </div>
      </div>
      <div class="clearer"></div>
    </div>
    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="genindex.html" title="General Index"
             >index</a></li>
        <li><a href="#">Beautiful Soup 4.2.0 Doc. 日本語訳 (2013-11-19最終更新)</a> &raquo;</li>
      </ul>
    </div>
    <div class="footer">
        &copy; Copyright 2013, Leonard Richardson.
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.
    </div>
  </body>
</html>